题目:输入某二叉树的前序遍历和中序遍历的结果,假设结果中不包含重复元素,请重建该二叉树。
思路:前序:访问顺序:根-->左子树-->右子树
后序:访问顺序:左子树-->根-->右子树
1.要想重建一个序列的二叉树,就要知道每序列中每一个结点的左子树和右子树。
2.前序序列的第一个结点值就是根结点的值,根据这个根结点的值到遍历中序序列,找到这个结点,则这个结点的左边序列
为根的左子树,右边序列为根的右子树。
代码如下:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public
class
Solution {
public
TreeNode reConstructBinaryTree(
int
[] pre,
int
[] in) {
return
reConstructBinaryTreeOne(pre,
0
,pre.length-
1
,in,
0
,in.length-
1
);
}
private
TreeNode reConstructBinaryTreeOne(
int
[] pre,
int
startPre,
int
endPre,
int
[] in,
int
startIn,
int
endIn){
//标明了什么时候跳出递归
if
(startPre>endPre||startIn>endIn)
return
null
;
//将当前输入的前序序列的第一个结点作为根结点,到输入的中序序列中找它的左子树和右子树
TreeNode root=
new
TreeNode(pre[startPre]);
for
(
int
i=startIn;i<=endIn;i++){
if
(pre[startPre]==in[i])
//根结点的左子树
root.left=reConstructBinaryTreeOne(pre,startPre+
1
,i-startIn+startPre,in,startIn,i-
1
);
//根结点的右子树
root.right=reConstructBinaryTreeOne(pre,i-startIn+startPre+
1
,endPre,in,i+
1
,endIn);
}}
return
root;
}
}