zoukankan      html  css  js  c++  java
  • 二叉树遍历思想(一) : 前序遍历

      二叉树递归定义 : 

      1) 空节点(null)为二叉树

      2)二叉树的左子树为二叉树,二叉树的右子树为二叉树。

      二叉树的前序遍历递归定义 : 

      1) 当前节点为空(null)直接返回

      2) 对于非空节点

        i)   操作当前节点

        ii)  前序遍历左子树

        iii) 前序遍历右子树

      二叉树的非递归遍历方法 : 

        使用栈来进行遍历。

        策略简述 : 

          利用栈和循环,每次循环的输入变量node都必须为当前要遍历的树的根节点。也就是将循环当作递归函数使用。

          例如当前输入node = root,那么对于当前层面来说,下一次 node = root.left。当左子树前序遍历结束后,必定要是 node = root.right。

          那么如何实现上述例子呢?

     1 class Solution {
     2     public List<Integer> preorderTraversal(TreeNode root) {
     3         List<Integer> res = new ArrayList<Integer>();
     4         Stack<TreeNode> stack = new Stack<TreeNode>();
     5         while (root != null || !stack.isEmpty()) {
     6             if (root != null){
     7                 res.add(root.val);
     8                 stack.push(root.right);
     9                 root = root.left;
    10             }else {
    11                 root = stack.pop();
    12             }
    13         }return res;
    14     }
    15 }

      代码解释 :

        第五行是边界条件 : 什么时候结束遍历? 当当前节点为空节点且栈也为null时。

        循环的输入参数 : root, stack。

        什么时候左子树遍历完毕,要遍历上一层的树根节点的右子树? 当当前节点指针为空的时候。也就意味着左子树遍历完毕了。

           

  • 相关阅读:
    题解 P1030 【求先序排列】
    行列式及其打开方式
    题解 P2580 【于是他错误的点名开始了】
    题解 P1130 【红牌】
    题解 P5239 【回忆京都】
    题解 P1184 【高手之在一起】
    【笔记】自学ST表笔记
    题解 P1208 【[USACO1.3]混合牛奶 Mixing Milk】
    树状数组自学笔记
    EBS R12.2系统logo的修改
  • 原文地址:https://www.cnblogs.com/vizdl/p/12287618.html
Copyright © 2011-2022 走看看