美文网首页
Binary Tree Preorder Traversal,

Binary Tree Preorder Traversal,

作者: 爱吃虾的雅典娜 | 来源:发表于2017-05-04 11:02 被阅读56次

    递归版本

    1#LeetCode 144. Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values.
    Note: Recursive solution is trivial, could you do it iteratively?

    Preorder: root, left, right

    Recursive version:
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            traverse (root, result);
            return result;
        }
        public void traverse (TreeNode root, List<Integer> result) {
            if (root == null) {
                return;
            }
            result.add(root.val);
            traverse(root.left, result);
            traverse(root.right, result);
        }
    }
    
    Non-recursive version:
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            Stack<TreeNode> stack = new Stack<>();
            List<Integer> result = new ArrayList<>();
            if (root == null) {
                return result;
            }
            stack.push(root);
            while(!stack.isEmpty()) {
                TreeNode node = stack.pop();
                result.add(node.val);
                // 关键点:要先压入右孩子,再压入左孩子,这样在出栈时会先打印左孩子再打印右孩子 
                if (node.right != null) {
                    stack.push(node.right);
                }
                if (node.left != null) {
                    stack.push(node.left);
                }
            }
            return result;
        }
    }
    

    2#LeetCode 94. Binary Tree Inorder Traversal

    Given a binary tree, return the inorder traversal of its nodes' values.
    Note: Recursive solution is trivial, could you do it iteratively?

    Inorder: left, root, right

    Recursive version:
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            traverse (root, result);
            return result;
        }
        public void traverse (TreeNode root, List<Integer> result) {
            if (root == null) {
                return;
            }
            traverse(root.left, result);
            result.add(root.val);
            traverse(root.right, result);
        }
    }
    
    用栈先把根节点的所有左孩子都添加到栈内, 
    然后输出栈顶元素,再处理栈顶元素的右子树 
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            Stack<TreeNode> stack = new Stack<>();
            if (root == null) {
                return result;
            }
            TreeNode cur = root;
            while (cur != null || !stack.isEmpty()) {
                while (cur != null) {
                    stack.add(cur);
                    cur = cur.left;
                }
                cur = stack.pop();
                result.add(cur.val);
                cur = cur.right;
            }
            return result;
        }
    }
    

    3#145. Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values.
    Note: Recursive solution is trivial, could you do it iteratively?

    postorder: left, right, root

    Recursive version:
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    public class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> result = new ArrayList<>();
            traverse(root, result);
            return result;
        }
        public void traverse (TreeNode root, List<Integer> result) {
            if (root == null) {
                return;
            }
            traverse(root.left, result);
            traverse(root.right, result);
            result.add(root.val);
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题: Binary Tree Preorder Traversal,

          本文链接:https://www.haomeiwen.com/subject/arjftxtx.html