在二叉樹中每個節點最多只能有兩個子節點。即左子節點和有子節點。
在二叉樹中最重要的操作應當是遍歷。即按照某一順序訪問二叉樹中的每乙個節點。
一般有如下幾種遍歷方法
1:前序遍歷,即先訪問根幾點,然後再訪問左子節點,最後訪問右子節點。
2:中序遍歷,即先訪問左子節點,然後再訪問根節點,最後訪問右子節點。
3:後序遍歷,即先訪問左子節點,然後再訪問右子節點,最後訪問根節點。
對於這三種遍歷方法中的「*序「來說,都是針對於根節點的,按照根節點在遍歷過程中的前中後來區分的。
這三種遍歷方法都有兩種不同的實現方式,迴圈和遞迴,遞迴實現起來要比迴圈簡單的多。
除了上述三種遍歷方法,還有一種是寬度優先遍歷。即按照」層「的觀點去訪問二叉樹。
二叉樹有很多特殊的例子,比如二叉搜尋樹就是其中乙個例子。在二叉搜尋樹中左子節點總是小於根節點,右子節點總是大於根節點。
我們可以在log(n)的時間內根據指定的值在二叉樹中找到乙個節點。
我們可以根據乙個前序遍歷序列和乙個中序遍歷序列來重新構建出乙個二叉樹,**如下:
//節點的定義
struct binarytreenode
在二叉樹的前序序列中第乙個數一定是二叉樹的根節點。
但是在中序序列中二叉樹的根節點一定是在序列的中間位置,根節點左邊的就是左子樹,右邊的就是右子樹。
這樣我們就可以用遞迴的方式來實現重建二叉樹的操作。
binarytreenode* construct(int* preorder,int* inorder,int length)
binarytreenode* constructcore(int* startpreorder,int* endpreorder,int* startinorder,int* endinorder)
//在中序序列中找到根節點的位置
int* rootinorder=startinorder;
while(rootinorder <= endinorder && *rootinorder != rootvalue)
++ rootinorder;
//沒有檢索到根節點的話丟擲異常資訊
if(rootinorder == endinorder && *rootinorder != rootvalue)
throw std::exception("invalid input.");
int leftlength= rootinorder-startinorder;
int* leftpreorderend=startpreorder + leftlength;
//存在左子樹的話
if(leftlength > 0)
//存在右子樹的話
if(leftlengthm_pright = constructcorre(leftpreorderend + 1,endpreorder,rootinorder+1,endinorder);
}return root;
}
資料結構之二叉樹
定義 滿足以下條件的就是樹 1.有且僅有乙個特定的稱為根root的結點。2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是乙個棵樹,並稱為根的子樹。樹是資料結構中一種常見的資料結構,比如我們排序中常見的二叉樹,紅黑樹等。最常見的是樹形表示法和廣義表表示法。樹的結構示意...
資料結構之二叉樹
來看一下樹的結構 class treenode public treenode string value 首先,為了方便後面看到效果,先手動初始化乙個有4個節點的二叉樹 tree tree new tree treenode root new treenode root treenode node1...
資料結構之二叉樹
資料結構 大一學c 的時候就非常頭疼的東西,沒想到現在js都要考資料結構與演算法了,看到有面試題手寫乙個二叉樹插入,對比劍指offer上的題真算得上是太簡單了。本次整合一下做過的二叉樹題的思路和 希望能對邏輯思維的提公升有個幫助。寫出二叉樹插入方法insert。分析 首先判斷根節點有無,如果沒有就賦...