根据前序遍历和中序遍历结果重构二叉树
力扣原题链接:剑指 Offer 07. 重建二叉树 - 力扣(LeetCode) (leetcode-cn.com)
思路
中序遍历结果为左子树->根结点->右子树
由此我们可以确定树的范围,左子树范围为[0,根结点),根结点,(根结点,中序遍历结果数组长度-1]
再根据前序遍历结果确定根结点位置,前序遍历结果为根结点->左子树->右子树
然后递归就行了
递归出口为:当树范围的左边界大于右边界时,说明该结点为null结点
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
class Solution { int[] preorder; HashMap<Integer, Integer> map = new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder = preorder; for (int i = 0; i < inorder.length; i++) { map.put(inorder[i],i); } return build(0,0,preorder.length-1); }
public TreeNode build(int root,int left,int right){ if (left>right){ return null; } TreeNode node = new TreeNode(preorder[root]); int i = map.get(preorder[root]); node.left = build(root+1,left,i-1); node.right = build(root+1+i-left,i+1,right); return node; } }
|