目录
1. 根据前序与中序构造二叉树
2. 根据后序与中序构造二叉树
1. 根据前序与中序构造二叉树
根据前序与中序遍历构造二叉树
题目:给定一棵树的前序遍历 preorder?与中序遍历?inorder, 请构造二叉树并返回其根节点?。
例如:
?
可以点开上述链接查看题目,具体做法如下:
分析:从前序遍历可以得到根结点,从中序中可以得到跟结点的左右子树部分,我们在构造二叉树的时候是从前序找根,再在中序中找根的左右子树部分先创建根节点再分别创建跟的左子树与跟的右子树,这个过程是一个递归,每次递归都要确定在中序哪个区间找新的根。
注意:前序顺序是根---左---右,所以还原的时候是根---左---右,这样才使得index++成立,index为标记前序的根,index从前序的开始依次走向末尾
具体步骤:
1. 在前序遍历中找根
2. 在中序遍历找根,用pos标记分界点,pos的左右两部分为递归找左与递归找右
3. 先还原根结点,再递归还原根的左子树,递归还原根的右子树
4. 递归还原的时候是依据中序遍历划分的范围
参考代码:
class Solution {
int index = 0; //标记前序的根
public TreeNode buildTree(int[] preorder, int[] inorder) {
return reBuildTree(preorder,inorder,0,inorder.length);
}
public TreeNode reBuildTree(int[] preorder,int[] inorder,int left,int right){
//递归返回条件
if(index>=preorder.length || left>=right){
return null;
}
int pos = left;
//在中序中找根的位置
while(pos < right){
if(inorder[pos] == preorder[index]){
break;
}
pos++;
}
TreeNode root = new TreeNode(preorder[index]);//还原根
index++;
root.left = reBuildTree(preorder,inorder,left,pos);//递归还原左
root.right = reBuildTree(preorder,inorder,pos+1,right);//递归还原右
return root;
}
}
2. 根据后序与中序构造二叉树
根据后序与中序构造二叉树
题目:根据一棵树的中序遍历与后序遍历构造二叉树。
例如:
??
可以点开上述链接查看题目,具体做法如下:
分析:后序遍历可以确定根结点,中序遍历可以得到根结点的左右子树两部分,所以还在中序遍历中找根节点的位置,用pos标记,将中序遍历分为两个部分,再分别在这两个部分中递归构造根的左子树与根的右子树。
注意:后续遍历是左---右---根,所以我们在还原的时候倒着还原,还原顺序为:根---右---左,这样使得index--成立,index为标记后续的根,它从后续的末尾依次走向开始
具体步骤:
1. 从后续遍历中找到根
2. 在中序中找到根的位置,用pos标记将中序遍历分为两部分
3. 在pos标记的右部分递归还原根的右子树
4. 在pos标记的左部分递归还原根的左子树
参考代码:
class Solution {
int index; //标记后序遍历的根
public TreeNode buildTree(int[] inorder, int[] postorder) {
index = postorder.length-1; //后续的根
return reBuildTree(inorder,postorder,0,inorder.length);
}
public TreeNode reBuildTree(int[] inorder,int[] postorder,int left,int right){
//递归返回条件
if(index < 0 || left >= right){
return null;
}
//在中序遍历中找到根的位置
int pos = left;
while(pos < right){
if(postorder[index] == inorder[pos]){
break;
}
pos++;
}
//还原根
TreeNode root = new TreeNode(postorder[index]);
index--;
root.right = reBuildTree(inorder,postorder,pos+1,right); //还原根的右
root.left = reBuildTree(inorder,postorder,left,pos); //还原根的左
return root;
}
}
|