題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
在完成**之前,我自己分析了一下如何根據前序遍歷和中序遍歷的結果構建一棵二叉樹。首先,根據二叉樹遍歷的性質,由前序遍歷的結果序列可知該二叉樹的根節點是1,在根據中序遍歷的結果可是根節點1的左子樹包含的結點是4、7、2,右子樹包含的節點是5、3、8、6。現在考慮左子樹中節點4、7、2,由於這三個節點在前序遍歷的結果是2、4、7,那麼2必然是這三個節點組成的子樹的根節點,再回到中序遍歷的結果4、7、2,那麼可以判斷出4是2的左孩子,7是4的右孩子;同理可以對右子樹進行判斷。這樣,畫出的二叉樹是這樣的:
自然,我們可以分析判斷過程寫出構建二叉樹的完整**:
package com.rhwayfun.offer;
public
class constructbinarytree
}public treenode reconstructbinarytree(int pre, int in)
private treenode constructcore(int pre,int startpreorder, int endpreorder, int in,int startinorder, int endinorder)
}//根據中序遍歷的結果找到根節點
int rootofinorder = startinorder;
while(rootofinorder <= endinorder && in[rootofinorder] != rootvalue)
//異常處理
if(rootofinorder == endinorder && in[rootofinorder] != rootvalue)
//計算左子樹的長度
int leftsubtreelen = rootofinorder - startinorder;
//根據左子樹的長度計算前序遍歷結果中左子樹的最後乙個結點的下標
int leftindexofpreorderend = startpreorder + leftsubtreelen;
//重建左子樹
if(leftsubtreelen > 0)
//重建右子樹
if(leftsubtreelen < endpreorder - startpreorder)
return rootnode;
}public
static
void
main(string args) ;
int in = ;
treenode root = new constructbinarytree().reconstructbinarytree(pre, in);
system.out.println(root);}}
劍指offer(四) 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。我們先來弄懂前序遍歷和中序遍歷的特點 前序遍歷 根結點 左子樹 右子樹。中序遍歷 左子樹 根結點 右子樹。所以前序遍歷序列的第乙個值...
劍指Offer 四 重建二叉樹
解法1 前序遍歷的第乙個數為樹的根,而中序遍歷中根所在位置的左面的序列即為左子樹的中序遍歷,右面即為右子樹的中序遍歷,遞迴找到每個子樹的根就ok了!class solution 返回構造的treenode根節點 def reconstructbinarytree self,pre,tin write...
劍指Offer 四 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。coding utf 8 class treenode def init self,x self.val x self.left n...