劍指offer個人刷題歷程記錄
阿新 • • 發佈:2018-11-16
劍指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;
}
}
總結
一開始的思路就不對,資料結構的演算法都忘記了,需要重新拾起。能力太弱了,需要努力。
已知前序和中序遍歷,可以確定一棵二叉樹。已知中序和後序遍歷,可以確定一棵二叉樹。但是,已知前序和後序遍歷,不能確定一棵二叉樹。