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

2021-10-03 13:46:05 字數 903 閱讀 8773

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。

二叉樹:二叉樹是樹的一種特殊結構,在二叉樹中每個結點最多只能有兩個子結點。在二叉樹中最重要的操作是遍歷,即按照某一順序訪問樹中的所有結點。樹的遍歷方式:

前序遍歷:先訪問根節點,再訪問左子結點,最後訪問右子結點;(根左右)

中序遍歷:先訪問左子結點,再訪問根結點,最後訪問右子結點;(左根右)

後序遍歷:先訪問左子結點,再訪問右子結點,最後訪問根結點;(左右根)

在二叉樹的前序遍歷序列中,第乙個數字總是樹的根結點的值。但在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹的結點的值位於根結點的值的右邊。因此我們需要掃瞄中序遍歷序列,才能找到根結點的值。

前序遍歷序列的第乙個數字1就是根結點的值。掃瞄中序遍歷序列,就能確定根結點的值的位置。根據中序遍歷特點,在根結點的值1前面的3個數字都是左子樹結點的值,位於1後面的數字都是右子樹結點的值。

分別找到了左、右子樹的前序遍歷序列和中序遍歷序列,我們就可以用同樣的方法分別去構建左右子樹,這是乙個遞迴的過程。

/*

public class treenode

}*/class

solution

private

treenode

reconstructbinarytree

(int

pre,

int startpre,

int endpre,

int[

] tin,

int startin,

int endin)

}return tree;

}}

面試題 重建二叉樹

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

二叉樹面試題

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...