輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
二叉樹:二叉樹是樹的一種特殊結構,在二叉樹中每個結點最多只能有兩個子結點。在二叉樹中最重要的操作是遍歷,即按照某一順序訪問樹中的所有結點。樹的遍歷方式:
前序遍歷:先訪問根節點,再訪問左子結點,最後訪問右子結點;(根左右)
中序遍歷:先訪問左子結點,再訪問根結點,最後訪問右子結點;(左根右)
後序遍歷:先訪問左子結點,再訪問右子結點,最後訪問根結點;(左右根)
在二叉樹的前序遍歷序列中,第乙個數字總是樹的根結點的值。但在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹的結點的值位於根結點的值的右邊。因此我們需要掃瞄中序遍歷序列,才能找到根結點的值。
前序遍歷序列的第乙個數字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...