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