• Leetcode: 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?

    Analysis: 第一反应肯定是recursion(递归), 非常直接,但是题目要求不能用递归。如果要使用迭代的方法来写preorder traversal,最大的问题是要如何确定遍历节点的顺序,因为树的pre-order traversal其实很类似图的DFS,DFS可以用Stack来写,所以这里写pre-order traversal也可以用stack来实现迭代的写法。

    Iterative: 其实就是用一个栈来模拟递归的过程。所以算法时间复杂度也是O(n),空间复杂度是栈的大小O(logn)。

     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<>();
    13         TreeNode p = root;
    14         Stack<TreeNode> stack = new Stack<>();
    15         while (p!=null || !stack.isEmpty()) {
    16             if (p != null) {
    17                 stack.push(p);
    18                 res.add(p.val);
    19                 p = p.left;
    20             }
    21             else {
    22                 TreeNode node = stack.pop();
    23                 p = node.right;
    24             }
    25         }
    26         return res;
    27     }
    28 }

    recursion:

     1 /**
     2  * Definition for binary tree
     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 ArrayList<Integer> preorderTraversal(TreeNode root) {
    12         ArrayList<Integer> result = new ArrayList<Integer>();
    13         preorder(root, result);
    14         return result;
    15     }
    16     
    17     public void preorder(TreeNode root, ArrayList<Integer> result) {
    18         if (root == null) return;
    19         result.add(root.val);
    20         preorder(root.left, result);
    21         preorder(root.right, result);
    22     }
    23 }
  • 相关阅读:
    nyoj--325--zb的生日(简单dp)
    nyoj--124--中位数(水题)
    nyoj--90--整数划分(母函数)
    nyoj--18--The Triangle(dp水题)
    CodeForces ---596B--Wilbur and Array(贪心模拟)
    nyoj--1023--还是回文(动态规划)
    poj--3984--迷宫问题(bfs+路径记录)
    Netty(4)Stream by codec(粘包与拆包)
    Netty(1-1)Discard
    Netty:option和childOption参数设置说明
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3796289.html
Copyright © 2020-2023  润新知