劍指offer 面試題6 重建二叉樹

2021-07-02 12:11:27 字數 1727 閱讀 3777

題目:

輸入某二叉樹的前序遍歷和中序遍歷,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含有重複的數字。

例如,前序遍歷序列:{1,2,4,7,3,5,6,8},中序遍歷序列:{4,7,2,1,5,3,8,6}

則重建出的二叉樹如下所示,並輸出它的頭結點1。

基本思想:

前序遍歷:

前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左、右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。

中序遍歷:

中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。在遍歷左、右子樹時,仍然先遍歷左子樹,再訪問根結點,最後遍歷右子樹。

1、先序遍歷序列的第乙個元素必定是根節點,可以由此獲取二叉樹的根節點。

2、根據根節點,在中序遍歷序列中查詢該節點,由中序遍歷的性質可知,中序遍歷中該根節點左邊的序列必定在根節點的左子樹中,而根節點右邊的序列必定在右子樹中。由此可以知道先序遍歷中左子樹以及右子樹的起止位置。

3、分別對左子樹和右子樹重複上述的過程,直至所有的子樹的起止位置相等時,說明已經到達葉子節點,遍歷完畢。

//二叉樹結點定義

typedef struct bitreenodebitreenode,*bitree;

//訪問函式

void visit(bitree t)

//先序遍歷

void preorder(bitree t)

} //中序遍歷

void inorder(bitree t) }

//後序遍歷

void postorder(bitree t) }

bitree constructor(int * startp,int * endp,int * starti,int * endi)

//在中序遍歷中找到根節點的值

int * rooti=starti;

while(rooti<=endi && *rooti!=rootvalue)

++rooti;

if(rooti==endi && *rooti!=rootvalue)

return null;

int leftlen=rooti-starti;

int *leftpe=startp+leftlen;

if(leftlen>0)

if(leftlenrchild=constructor(leftpe+1,endp,rooti+1,endi);

} return root;

} bitree foo(int * pre,int * ino,int len)

void main()

;int ino=;

int len=sizeof(pre)/sizeof(pre[0]);

bitree t = foo(pre,ino,len);

cout<

cout

劍指offer《面試題6 重建二叉樹》

題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建出下圖所示的二叉樹並輸出它的頭結點。1 2 3 4 5 6 7 8 劍指offer 名企面試官精講典型程式設計題 著作權所有者 何海濤 inc...

劍指offer 面試題6重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。重建出二叉樹,並輸出根節點。二叉樹的定義如下 如上,前序遍歷 1,2,4,7,3,5,6,8,中序 4,7,2,1,5,3,8,6,後序遍歷 7,4,2,5,8,6,3,1 在二叉樹的前序...

劍指Offer 面試題6 重建二叉樹

題目 輸入某二叉樹的連續遍歷和後序遍歷結果,請重建此二叉樹.輸出它的頭結點.假設輸入的前序遍歷和後序遍歷結果中都不含重複數字 分析 public class solution 構造出二叉樹的方法 param pre 子樹的前序遍歷陣列 param startpre 子樹的前序遍歷陣列第乙個數在pre...