构造二叉树集锦

105. 从前序与中序遍历序列构造二叉树

class Solution {
    int index = 0;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return buildTreeInternal(preorder,inorder,0,inorder.length);
    }

    public TreeNode buildTreeInternal(int[] preOrder,int[] inOrder,int left,int right) {
        if(left >= right) {
            return null;
        }
        if(index >= preOrder.length) {
            return null;
        }
        TreeNode root = new TreeNode(preOrder[index]);
        index++;
        int pos = find(inOrder,left,right,root.val);
        root.left = buildTreeInternal(preOrder,inOrder,left,pos);
        root.right = buildTreeInternal(preOrder,inOrder,pos + 1,right);
        return root;
    }

    private int find(int[] inOrder,int left,int right,int val) {
        for(int i = left;i < right;i++) {
            if(inOrder[i] == val) {
                return i;
            }
        }
        return -1;
    }
}

运行截图:
在这里插入图片描述

106. 从中序与后序遍历序列构造二叉树

class Solution {
    Map<Integer,Integer> map = new HashMap<> ();
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        int[] preOrder = reverse(inorder,postorder);
        return buildTreeInteral(preOrder,inorder,0,inorder.length);
        }

        int index = 0;
        public TreeNode buildTreeInteral(int[] preOrder,int[] inOrder,int left,int right) {
            if(left >= right) {
                return null;
            }
            if(index >= preOrder.length) {
                return null;
            }
            TreeNode root = new TreeNode(preOrder[index]);
            index++;
            int pos = map.get(root.val);
            root.right = buildTreeInteral(preOrder,inOrder,pos + 1,right);
            root.left = buildTreeInteral(preOrder,inOrder,left,pos);
            return root;
        }
        private int[] reverse(int[] inorder,int[] postorder) {
            int[] ret = new int[postorder.length];
            for(int i = 0;i < ret.length;i++) {
                ret[i] = postorder[ret.length - 1 -i];
            }
            for(int i = 0;i < inorder.length;i++) {
                map.put(inorder[i],i);
            }
            return ret;
        }
}

运行截图:
在这里插入图片描述

889. 根据前序和后序遍历构造二叉树

class Solution { 
    public TreeNode constructFromPrePost(int[] preorder, int[] postorder) { 
        int length = preorder.length; 
        TreeNode root = new TreeNode(preorder[0]); 
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>(); 
        stack.push(root); 
        int postorderIndex = 0; 
        for (int i = 1; i < length; i++) { 
            TreeNode prev = stack.peek(); 
            TreeNode curr = new TreeNode(preorder[i]); 
            if (prev.val != postorder[postorderIndex]) { 
                prev.left = curr; 
                stack.push(curr);
                } else { 
                    while (stack.peek().val == postorder[postorderIndex]) { 
                        stack.pop(); 
                        postorderIndex++;
                        } 
                        prev = stack.peek(); 
                        prev.right = curr; 
                        stack.push(curr); 
                        }
        } 
                        return root;
    }
}

运行截图:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值