剑指offer—重建二叉树
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
解题思路:
1.首先需要了解二叉树的结构,根据前序遍历和中序遍历找出根节点。
前序遍历:首先第一个节点是根节点,其次访问左子树和右子树。
中序遍历:根据前序遍历,找到左子树和右子树。
2.使用递归,不断地遍历左子树,右子树。
注意点:
开始使用java语言,一直看python导致书写格式经常犯错。
具体代码:
1.这个是看懂但是运行出来不对的
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int pLen=pre.length;
int iLen=in.length;
if(pLen==0&&iLen==0){
return null;
}
return btConstruct(pre,in,0,pLen-1,0,iLen-1);
}
//构建方法,pStart和pEnd分别是前序遍历序列数组的第一个元素和最后一个元素
//iStart和iEnd分别是中序遍历序列数组的第一个元素和最后一个元素
public TreeNode btConstruct(int[] pre,int [] in,int pStart,int pEnd,int iStart,int iEnd)
{
//建立根节点
TreeNode tree=new TreeNode(pre[pStart]);
tree.left=null;
tree.right=null;
if(pStart==pEnd && iStart==iEnd)
{
return tree;
}
int root=0;
//找中序遍历中的根节点
for(root=iStart; root<iEnd;root++)
{
if(pre[pStart]==root)
{
break;
}
}
int leftlength=root-iStart;
int rightlength=iEnd-root;
//遍历左子树
if(leftlength>0)
{
tree.left=btConstruct(pre,in,pStart+1,pStart+leftlength, iStart, root-1);
}
//遍历右子树
if(rightlength>0)
{
tree.right=btConstruct(pre,in,pStart+leftlength+1,pEnd,root+1,iEnd);
}
return tree;
}
}
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) {
TreeNode root=reConstructBTree(pre,0,pre.length-1,in,0,in.length-1);
return root;
}
private TreeNode reConstructBTree(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(in[i]==pre[startPre]){
root.left=reConstructBTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1);
root.right=reConstructBTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn);
}
return root;
}
}
总结
一开始的思路就不对,数据结构的算法都忘记了,需要重新拾起。能力太弱了,需要努力。
已知前序和中序遍历,可以确定一棵二叉树。已知中序和后序遍历,可以确定一棵二叉树。但是,已知前序和后序遍历,不能确定一棵二叉树。