zoukankan      html  css  js  c++  java
  • 144. Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3
    

    return [1,2,3].

    Note: Recursive solution is trivial, could you do it iteratively?

    本题和Binary Tree Inorder Traversal有点类似,但是思路是有点不相同的,先说本题思路,也是创建一个stack,一个Treenode,但是stack用来存储所有的右节点,先把node的值存储到list里面,然后遍历到它的左节点,如果它的左节点为null并且stack有值,则让节点等于stack的pop值,代码如下:

     1 /**
     2  * Definition for a binary tree node.
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public List<Integer> preorderTraversal(TreeNode root) {
    12         List<Integer> res=  new ArrayList<Integer>();
    13         Stack<TreeNode> stack = new Stack<TreeNode>();
    14         TreeNode node = root;
    15         while(node!=null){
    16             res.add(node.val);
    17             if(node.right!=null){
    18                 stack.push(node.right);
    19             }
    20             node = node.left;
    21             if(node==null&&!stack.isEmpty()){
    22                 node = stack.pop();
    23             }
    24         }
    25         return res;
    26     }
    27 }

    问题来了,那么它和中序遍历中有什么不同呢?首先,中序的循环里面还有一个while循环,这个while用来遍历到最左面的节点用的,而先序遍历是不用这么做的。其次,res的add情况不同,中序是遍历到最左面之后在add,而中序是每次循环开始的时候add的;第三,stack存储的值不同,中序里面存储的是中间节点(相对来说),而先序遍历里面存储的是右节点;

  • 相关阅读:
    15、线程
    17、lambda表达式
    16、sockect
    14、反射(reflect)
    13、集合2
    java 基本类型、包装类、字符串之间的转换
    13、集合1
    12、NIO、AIO、BIO二
    12、NIO、AIO、BIO一
    11、流与文件
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6603170.html
Copyright © 2011-2022 走看看