十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
今天就跟大家聊聊有關(guān)怎樣實(shí)現(xiàn)重建python二叉樹,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),城中網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:城中等地區(qū)。城中做網(wǎng)站價(jià)格咨詢:18982081108
題目:
輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請重建出該二叉樹。假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹并返回。
思路:
看到這個(gè)題目就明白需要花點(diǎn)時(shí)間,上數(shù)據(jù)結(jié)構(gòu)課的時(shí)候,明白了怎么根據(jù)前序和中序可以唯一確定一顆二叉樹,并且也知道怎么重建,但是要用代碼實(shí)現(xiàn)起來,還是有點(diǎn)困難,畢竟自己很久沒有寫了。我知道要實(shí)現(xiàn)那種思路,肯定需要借用遞歸或者歸并。但是不是理的很清,后面覺得借鑒別人怎么實(shí)現(xiàn)的,看完之后,決定自己動手,最開始用java編寫,寫完之后,出現(xiàn)空指針異常和數(shù)組非法訪問錯(cuò)誤,與別人代碼對了很久,最后終于找到錯(cuò)誤了,這個(gè)題困了我一天。對于空指針異常,自己建立對象或者聲明數(shù)組的時(shí)候最好還是初始化,不要等到后面才想起,數(shù)組非法訪問是由于自己聲明的數(shù)組太大,沒有很嚴(yán)謹(jǐn),導(dǎo)致我前面一直找不到自己錯(cuò)在哪,感覺沒有越界,把數(shù)組大小嚴(yán)格改到題目要求所需之后,就提交成功了,可能之前寫C語言寫習(xí)慣了,沒有注意這方面,以后還是嚴(yán)謹(jǐn)一點(diǎn)。用js代碼實(shí)現(xiàn)比Java要方便很多,比較順利,雖然也出現(xiàn)錯(cuò)誤,但是解決了java坑之后,來解決Js的坑就快很多了;
對于這種題目,主要還是想清楚怎么用遞歸實(shí)現(xiàn),注意細(xì)節(jié)
java實(shí)現(xiàn)代碼:
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int len=in.length;
if(len==0)
return null;
TreeNode tree=new TreeNode(pre[0]);
int i,temp=-1,j=0;
for(i=0;i if(pre[0]==in[i]){
temp=i;
break;
}
}
int[] left=new int[temp];
int[] leftpre=new int[temp];
for(i=0;i left[i]=in[i];
leftpre[i]=pre[i+1];
}//左子樹
int[] right=new int[len-temp-1];
int[] rightpre=new int[len-temp-1];
for(i=temp+1;i right[j]=in[i];
rightpre[j]=pre[i];
j++;
}//右子樹
tree.left=reConstructBinaryTree(leftpre,left);
tree.right=reConstructBinaryTree(rightpre,right);
return tree;
}
JavaScript實(shí)現(xiàn)代碼:
/* function TreeNode(x) {
this.val = x;
this.left = null;
this.right = null;
} */
function reConstructBinaryTree(pre, vin)
{
var len=vin.length;
if(len==0)
return null;
var tree=new TreeNode(pre[0]);
var i,temp=-1,j=0;
for(i=0;i if(pre[0]==vin[i]){
temp=i;
break;
}
}
var left=new Array(temp);
var leftpre=new Array(temp);
for(i=0;i left[i]=vin[i];
leftpre[i]=pre[i+1];
}//左子樹
var right=new Array(len-temp-1);
var rightpre=new Array(len-temp-1);
for(i=temp+1;i right[j]=vin[i];
rightpre[j]=pre[i];
j++;
}//右子樹
tree.left=reConstructBinaryTree(leftpre,left);
tree.right=reConstructBinaryTree(rightpre,right);
return tree;
// write code here
}
看完上述內(nèi)容,你們對怎樣實(shí)現(xiàn)重建python二叉樹有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。