面試題 重建二叉樹

2021-07-28 05:14:44 字數 1386 閱讀 5107

首先看到該題目,我們心裡應該清楚二叉樹的前序遍歷和中序遍歷各自有什麼特點,想不通的話可以在紙上畫一畫。前序遍歷序列中第乙個數字總是該二叉樹的根節點,但是在中序遍歷序列中根節點在中間,結合兩個序列,我們很容易就能知道二叉樹的根節點以及左右子樹,如下圖所示:

依照這種方法,第二遍查詢根節點為2,那麼在左子樹中(中序遍歷序列)可以發現2只有左子樹,接著根節點為4時,右子樹是7......按照這種思路就可以將一棵完整的二叉樹重構出來了,不難發現,這裡用了一種遞迴的思路,重建的二叉樹如下所示:建議在紙上畫一畫

在了解整棵樹如何重構之後,演算法**也就很容易能夠寫出來了,就是遞迴方法的一種實現

二叉樹節點定義:

struct binarytreenode

;

遞迴**如下:

binarytreenode* rebuildcore(int *startpreorder,int *endpreorder,int *startinorder,int *endinorder)

else

}//在中序遍歷中找到根節點

int *rootinorder = startinorder;

while (rootinorder <= endinorder && *rootinorder != rootvalue)

if (rootinorder == endinorder && *rootinorder != rootvalue)

int leftlength = rootinorder - startinorder;

int *leftinordernow = startpreorder + leftlength;

//構建左子樹

if(leftlength > 0)

//構建右子樹

if(leftlength < endpreorder - startpreorder)

return root;

}binarytreenode* rebuild(int *preorder,int *inorder,int length)

return rebuildcore(preorder,preorder+length-1,inorder,inorder+length-1);

}

參考劍指offer上的面試題,以上就是大概的思路,感受最深的是在寫**之前一定要先整理好自己的思路,不要一上來就開始寫,就想著我要實現這個功能,先把思路整理好,**實現就是將自己的思路用另外一種語言呈現出來罷了,所以,思路很重要。沒有思路的話,在紙上畫一畫,想一想,這個問題還能不能拆分成一些更小的自己能夠解決的一些問題,然後再整合,解決乙個大問題。

面試題 重建二叉樹(C 實現)

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。二叉樹 二叉樹是樹的一種特殊結構,在二叉樹中每個結點最多只能有兩個子結點。在二叉樹中最重要的操作是遍歷,即按照某一順序訪問樹中的所有...

二叉樹面試題

1.求二叉樹節點個數 可以使用遞迴解決。將問題分解為求根節點 左子樹的節點數 右節點的節點數。實現 public size t size private size t size node root 2.求頁節點個數 頁節點 左右子樹都為空的節點被稱為頁節點,使用遞迴遍歷,當碰到乙個左右子樹為空的節點...

面試題 二叉樹

面試題 二叉樹 1.重建二叉樹 前序 中序 treenode reconstructbinarytree vector pre,vector vin treenode root new treenode pre 0 int pos 0 for pos pre left,vin left,pre ri...