• LeetCode 144: Binary Tree Preorder Traversal


    /**
     * 144. Binary Tree Preorder Traversal
     * 1. Time:O(n)  Space:O(n)
     * 2. Time:O(n)  Space:O(n)
     * 3. Time:O(n)  Space:O(n)
     * 4. Time:O(n)  Space:O(1)
     */
    
    // 1. Time:O(n)  Space:O(n)
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> pre = new LinkedList<>();
            preorderHelper(root,pre);
            return pre;
        }
        
        public void preorderHelper(TreeNode root, List<Integer> pre){
            if(root==null) return;
            pre.add(root.val);
            preorderHelper(root.left,pre);
            preorderHelper(root.right,pre);
        }
    }
    
    // 2. Time:O(n)  Space:O(n)
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> res = new LinkedList<>();
            Stack<TreeNode> s = new Stack<>();
            if(root!=null) s.push(root);
            while(!s.empty()){
                TreeNode tmp = s.pop();
                res.add(tmp.val);
                if(tmp.right!=null) s.push(tmp.right);
                if(tmp.left!=null) s.push(tmp.left);
            }
            return res;
        }
    }
    
    // 3. Time:O(n)  Space:O(n)
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> res = new LinkedList<>();
            Stack<TreeNode> rights = new Stack<>();
            while(root!=null){
                res.add(root.val);
                if(root.right!=null)
                    rights.push(root.right);
                root = root.left;
                if(root==null && !rights.empty())
                    root = rights.pop();
            }
            return res;
        }
    }
    
    // 4. Time:O(n)  Space:O(1)
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> res = new LinkedList<>();
            TreeNode cur = root;
            while(cur!=null){
                if(cur.left==null){
                    res.add(cur.val);
                    cur = cur.right;
                }else{
                    TreeNode prev = cur.left;
                    while(prev.right!=null && prev.right!=cur)
                        prev = prev.right;
                    if(prev.right==null){
                        res.add(cur.val);
                        prev.right = cur;
                        cur = cur.left;
                    }else if(prev.right==cur){
                        prev.right=null;
                        cur = cur.right;
                    }
                }
            }
            return res;
        }
    }
    
  • 相关阅读:
    《你一定爱读的极简欧洲史》
    PAT 1051. 复数乘法
    PAT 1050. 螺旋矩阵
    PAT 1049. 数列的片段和
    PAT 1048. 数字加密
    PAT 1047. 编程团体赛
    PAT 1046. 划拳
    PAT 1045. 快速排序
    PAT 1044. 火星数字
    PAT 1043. 输出PATest
  • 原文地址:https://www.cnblogs.com/AAAmsl/p/12785794.html
Copyright © 2020-2023  润新知