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 }
  • 相关阅读:
    图片上传功能,前端,后台,完整版代码
    JS 字符串常用操作
    安卓真机运行webview,被撑破,解决方案。
    项目写法,总结
    VUE 的常用
    检查代码的方法
    很牛B的写法,数据库,查询,放在一个方法里面,统一过滤、
    走过的坑
    说说IEnumerable和yield
    关于display: inline-block的间隙问题
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/3796289.html
Copyright © 2011-2022 走看看