zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Oracle存储过程编译卡死的解决方法
    异常来自 HRESULT:0x800A01A8
    WIP
    R12: How to add Microsoft Excel as Type to the Create Template List of Values in BI Publisher (Doc ID 1343225.1)
    XML Publisher Template Type
    打印报表以显示具有给定责任的用户-FNDSCRUR责任用户
    Credit Memo和Debit Memo在AR以及AP中的概念比较
    EBS-BG&LE&OU
    普通pc电脑安装苹果系统mac_详细教程(精)附带所有工具下载
    教程 打造OS X Mavericks原版 EFI Clover 引导安装
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3796289.html
Copyright © 2011-2022 走看看