106. 从中序与后序遍历序列构造二叉树(一般)

根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

1
2
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

思路1:

类比105

代码1:

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
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return BTreeConstruct(inorder, 0,inorder.length-1, postorder,0,postorder.length-1);
}
public TreeNode BTreeConstruct(int[] inorder,int is,int ie, int[] postorder,int ps,int pe) {
if(is>ie)//头尾一样,所有数据为0,直接返回
return null;
//后序尾节点就是根
int rootval = postorder[pe];
TreeNode root = new TreeNode(rootval);
//在中序遍历中找到根节点的位置
int irootindex = 0;
for(int i=is;i<=ie;i++){
if(rootval==inorder[i]){
irootindex = i;
break;
}
}
int leftNodeNum = irootindex-is;//在中序遍历中根节点左边的节点数
//递归构造,这里是重点
root.left = BTreeConstruct(inorder,is,irootindex-1,postorder,ps,ps+leftNodeNum-1);
root.right = BTreeConstruct(inorder,irootindex+1,ie,postorder,ps+leftNodeNum,pe-1);
return root;
}
}