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。

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

           

  • 相关阅读:
    排列数组所有情况
    查到的结果的某个字段在一串字符串之中
    element组件化跳转和路由式跳转
    vue路由and组件操作
    事件 绑定,取消冒泡,拖拽 ,点击,事件委托习题
    窗口属性 和DOM 元素尺寸位置 及习题加强
    DOM树的增删改查 和 Date定时任务
    JS DOM 初做了解,习题笔记
    struts配置及检验
    第一个JSP登录跳转
  • 原文地址:https://www.cnblogs.com/vizdl/p/12287618.html
Copyright © 2011-2022 走看看