zoukankan      html  css  js  c++  java
  • 二叉树中序遍历

    http://www.lintcode.com/en/problem/binary-tree-inorder-traversal/

    注意点: 看不明白的话,先拿二叉树按代码的逻辑跑一遍。

        栈中先放root的左子树,之后清空后放右子树。

        非递归:    

        while(!s.empty() || temp != null) {
          while(temp != null) {           
            s.push(temp);
            temp = temp.left;            //while循环加下面的这系列操作相当于在result中存放左结点和root
          }
          temp = s.pop();          //相当于result中存放左结点和root
          result.add(temp.val);        //相当于result中存放左结点和root
          temp = temp.right;      //在result中存放右结点
        }

     1  //分治
     2  public ArrayList<Integer> inorderTraversal(TreeNode root) {
     3      ArrayList<Integer> result = new ArrayList<Integer>();
     4      if(root == null) return result;
     5     
     6      ArrayList<Integer> left = inorderTraversal(root.left);
     7      ArrayList<Integer> right = inorderTraversal(root.right);
     8      result.addAll(left);
     9      result.add(root.val);
    10      result.addAll(right);
    11      return result;
    12      
    13  }
    14  //非递归
    15  public ArrayList<Integer> inorderTraversal(TreeNode root) {
    16     Stack<TreeNode> stack = new Stack<TreeNode>();
    17     ArrayList<Integer> result = new ArrayList<Integer>();
    18     if(root == null) return result;
    19     TreeNode temp = root;
    20     //temp == null 表示此分支为null,不再需要往stack里添加结点,而是直接取出结点
    21     while(!stack.empty() || temp != null){
    22         while(temp != null) {
    23             stack.push(temp);
    24             temp = temp.left;
    25         }
    26         temp = stack.pop();
    27         result.add(temp.val);
    28         //temp != null,则相当于对右子树进行之前root的入栈操作 
    29         temp = temp.right;  
    30     }
    31     return result;    
    32  }
    33  
    34  //游走遍历, 要返回的结果一直作为参数在传递
    35  public ArrayList<Integer> inorderTraversal(TreeNode root) {
    36         ArrayList<Integer> result = new ArrayList<Integer>();
    37         return    traverse(root, result);
    38   }
    39  private ArrayList<Integer> traverse(TreeNode root, ArrayList<Integer> result) {
    40      if(root == null) return result;
    41      traverse(root.left, result);
    42      result.add(root.val);
    43      traverse(root.right, result);
    44      return result;
    45  }
    View 
  • 相关阅读:
    java 万能转换器 输入SQL 直接得到ArrayList
    社交原理
    意志力和自律
    windows phone 8.1 让项目开启蓝牙genericAttributeProfile
    C# JSON和对象之间互相转换
    QTC++监控USB插拔
    英语通假字
    #ifdef 支持Mac #ifndef 支持Windows #if defined (Q_OS_WIN) 应该可以再两个系统通用
    Qt5.3.2 在MAC yosemite下编译出错 Could not resolve SDK path
    Mac 用Ctr+C复制,Ctr+V 粘贴
  • 原文地址:https://www.cnblogs.com/ddcckkk/p/6813912.html
Copyright © 2011-2022 走看看