当前位置:   article > 正文

二叉树的前序遍历_二叉树前序遍历 输入:输入 [1,null,2,3] 输出:[1,2,3] 全代码

二叉树前序遍历 输入:输入 [1,null,2,3] 输出:[1,2,3] 全代码

一、需求

  • 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

      

  1. 输入:root = [1,null,2,3]
  2. 输出:[1,2,3]

提示:

  • 树中节点数目在范围 [0, 100] 内
  • -100 <= Node.val <= 100

进阶:递归算法很简单,你可以通过迭代算法完成吗?

二、递归法

2.1  思路分析

  1. 按照根、左、右的顺序递归子树即可;

2.2  代码实现

  1. class Solution {
  2. List<Integer> res = new ArrayList<>();
  3. public List<Integer> preorderTraversal(TreeNode root) {
  4. preOrder(root);
  5. return res;
  6. }
  7. private void preOrder(TreeNode root) {
  8. if(root == null) {
  9. return;
  10. }
  11. res.add(root.val);
  12. preOrder(root.left);
  13. preOrder(root.right);
  14. }
  15. }

2.3  复杂度分析

  • 时间复杂度为O(N),其中N为二叉树节点的个数;
  • 空间复杂度为O(N),最坏情况下,二叉树退化为链表,递归的深度可达N;

三、迭代法

3.1  思路分析

  1. 想想二叉树的前序遍历,按照根、左、右的方式进行,现在要显式的模拟递归时的入栈过程,首先是根节点,然后是其左子树,最后是右子树;
  2. 然后发现代码2中的一部分代码是可以省略的;

3.2  代码实现

  1. class Solution {
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. Deque<TreeNode> stack = new ArrayDeque<>();
  5. if(root == null) {
  6. return res;
  7. }
  8. res.add(root.val);
  9. stack.push(root);
  10. TreeNode node = root.left;
  11. //node != null作用是当栈中的根节点弹出时,此时栈为空,node指向右子节点
  12. while(node != null || !stack.isEmpty()) {
  13. while(node != null) {
  14. res.add(node.val);
  15. stack.push(node);
  16. node = node.left;
  17. }
  18. node = stack.pop();
  19. node = node.right;
  20. }
  21. return res;
  22. }
  23. }

3.3  代码优化

  1. class Solution {
  2. public List<Integer> preorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. Deque<TreeNode> stack = new ArrayDeque<>();
  5. TreeNode node = root;
  6. //node != null作用是当栈中的根节点弹出时,此时栈为空,node指向右子节点
  7. while(node != null || !stack.isEmpty()) {
  8. while(node != null) {
  9. res.add(node.val);
  10. stack.push(node);
  11. node = node.left;
  12. }
  13. node = stack.pop();
  14. node = node.right;
  15. }
  16. return res;
  17. }
  18. }

3.4  复杂度分析

  • 时间复杂度为O(N),需要遍历所有的节点;
  • 空间复杂度为O(N),最坏情况下,二叉树退化为链表,消耗O(N)的额外空间;

四、学习地址

作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/er-cha-shu-de-qian-xu-bian-li-by-leetcode-solution/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/50439
推荐阅读
相关标签
  

闽ICP备14008679号