Tree Traversal类

三种基本traversal的递归和迭代解法
inorder traversal类的习题:
第一部分是BST Tree类的习题,例如:
530. Minimum Absolute Difference in BST
783. Minimum Distance Between BST Nodes
这两个问题一个规定所有node的值为非负,另一个没有规定,但在实际的case中都是非负的,所以cpp的答案可以先让 prev = -1

94. Binary Tree Inorder Traversal

    //recursive solution, root.left->root->root.right
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }
    private void inorder(TreeNode root, List<Integer> res) {
        if (root == null) return;
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }
    //iterative solution
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.empty()) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            res.add(cur.val);
            cur = cur.right;
        }
        return res;
    }

144. Binary Tree Preorder Traversal

    //recursive solution, root->root.left->root.right
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res =  new ArrayList<>();
        preorder(root, res);
        return res;
    }
    private void preorder(TreeNode root, List<Integer> res) {
        if (root == null) return;
        res.add(root.val);
        preorder(root.left, res);
        preorder(root.right, res);
    }
    //iterative version
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();  
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !stack.empty()) {
            while (cur != null) {
                res.add(cur.val);
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            cur = cur.right;
        }
        return res;
    }

145. Binary Tree Postorder Traversal

    //recursive solution, root.left->root.right->root
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postorder(root, res);
        return res;
    }
    private void postorder(TreeNode root, List<Integer> res) {
        if (root == null) return;
        postorder(root.left, res);
        postorder(root.right, res);
        res.add(root.val);
    }
    //iterative solution, use method addFirst() of LinkedList
    public List<Integer> postorderTraversal(TreeNode root) {
        LinkedList res = new LinkedList<>();
        if (root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        stack.push(cur);
        while (!stack.empty()) {
            cur = stack.pop();
            res.addFirst(cur.val);
            if (cur.left != null) stack.push(cur.left);
            if (cur.right != null) stack.push(cur.right);
        }
        return res;
    }

105. Construct Binary Tree from Preorder and Inorder Traversal

    //with HashMap
    private int pre = 0;
    private int in = 0;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return build(preorder, inorder, Integer.MAX_VALUE);
    }
    private TreeNode build(int[] preorder, int[] inorder, int stop) {
        if (pre == preorder.length) 
            return null;
        if (inorder[in] == stop) {
            in++;
            return null;
        }
        TreeNode root = new TreeNode(preorder[pre++]);
        root.left = build(preorder, inorder, root.val);
        root.right = build(preorder, inorder, stop);
        return root;
    }
    //without HashMap
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) 
            map.put(inorder[i], i);
        return build(preorder, inorder, map, 0, preorder.length-1, 0, inorder.length-1);
    }
    private TreeNode build(int[] preorder, int[] inorder, Map<Integer, Integer> map, int preStart, int       preEnd, int inStart, int inEnd) {
        if (preStart > preEnd || inStart > inEnd) return null;
        TreeNode root = new TreeNode(preorder[preStart]);
        int rootIdx = map.get(root.val);
        int leftNums = rootIdx - inStart;
        root.left = build(preorder, inorder, map, preStart+1, preStart+leftNums, inStart, rootIdx-1);
        root.right = build(preorder, inorder, map, preStart+leftNums+1, preEnd, rootIdx+1, inEnd);
        return root;
    }

106. Construct Binary Tree from Inorder and Postorder Traversal

    //with HashMap
    private int post = 0;
    private int in = 0;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        post = postorder.length - 1;
        in = inorder.length - 1;
        return build(inorder, postorder, Integer.MAX_VALUE);
    }
    private TreeNode build(int[] inorder, int[] postorder, int stop) {
        if (post < 0)
            return null;
        if (inorder[in] == stop) {
            in--;
            return null;
        }
        TreeNode root = new TreeNode(postorder[post--]);
        root.right = build(inorder, postorder, root.val);
        root.left = build(inorder, postorder, stop);
        return root;
    }
    //with HashMap
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++)
            map.put(inorder[i], i);
        return build(inorder, postorder, map, 0, postorder.length-1, 0, inorder.length-1);
    }
    private TreeNode build(int[] inorder, int[] postorder, Map<Integer, Integer> map, int postStart, int postEnd, int inStart, int inEnd) {
        if (postStart > postEnd || inStart > inEnd)
            return null;
        TreeNode root = new TreeNode(postorder[postEnd]);
        int rootIdx = map.get(root.val);
        int leftNums = rootIdx - inStart;
        root.left = build(inorder, postorder, map, postStart, postStart+leftNums-1, inStart, rootIdx-1);
        root.right = build(inorder, postorder, map, postStart+leftNums, postEnd-1, rootIdx+1, inEnd);
        return root;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容