題目分析:
- 前序遍歷特點: 節(jié)點按照 [ 根節(jié)點 | 左子樹 | 右子樹 ] 排序碱蒙,以題目示例為例:[ 3 | 9 | 20 15 7 ]
- 中序遍歷特點: 節(jié)點按照 [ 左子樹 | 根節(jié)點 | 右子樹 ] 排序从祝,以題目示例為例:[ 9 | 3 | 15 20 7 ]
根據(jù)題目描述輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字立宜,其表明樹中每個節(jié)點值都是唯一的千绪。
遞歸解析:
- 遞歸參數(shù):前序和后續(xù)遍歷的數(shù)組int[] preorder,int[] inorder娃兽;左右指針int left,int right朽肥;根結(jié)點TreeNode head
- 代碼實現(xiàn):
class Solution {
int rootIndex = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length == 0){
return null;
}
TreeNode head = new TreeNode(0);
return build(preorder,inorder,0,inorder.length-1,head);
}
public TreeNode build(int[] preorder,int[] inorder,int left,int right,TreeNode head){
head = new TreeNode(preorder[rootIndex]);
int i = findValue(preorder[rootIndex],inorder);
rootIndex++;
if(i > left && rootIndex < preorder.length){
head.left = build(preorder,inorder,left,i-1,head.left);
}
if(i < right && rootIndex < preorder.length){
head.right = build(preorder,inorder,i+1,right,head.right);
}
return head;
}
public int findValue(int value,int[] target){
for(int i = 0;i < target.length;i++){
if(value == target[i]){
return i;
}
}
return -1;
}
}