二叉树遍历思想(一) : 前序遍历

  二叉树递归定义 : 

  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。

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

       

 

posted @ 2020-02-09 16:46  Vizdl  阅读(609)  评论(0编辑  收藏  举报