樹相關知識(補充)

2021-07-02 16:40:18 字數 1703 閱讀 4217

1、二叉樹的主要性質(6)

(1)非空二叉樹上葉子結點數等於雙分支結點數加1

a:總結點數=度為2的結點+度為1的結點+度為0的結點

b:總結點數=度為2的結點數*2+度為1的結點+1

由公式ab得出:度為0的結點等於度為2的結點+1

(2)二叉樹的第i層最多有2的i-1次方的結點。(等比數列)

(3)高度(或深度)為k的二叉樹最多有2的k次方-1個結點。

(4)有n個結點的完全二叉樹,對各節點從上到下從左到右依次編號(編碼號範圍為1至n)

若i為某結點a的編號,則可推出

a、如果i不等於1,那麼a的雙親結點的編號為i/2向下取整。

b、如果2i小於等於n,則a左孩子的編號為2i,若2i大於n,則a無左孩子。

c、如果2i+1小於等於n,則a左孩子的編號為2i+1,若2i+1大於n,則a無右孩子。

(5)catalan函式:給定n個結點,能構成多少中不同的二叉樹,2n任取n個/(n+1).

(6)具有n個結點的完全二叉樹的高度(或深度)為log(n+1)向上取整。

二叉樹的前中後遍歷的非遞迴實現

(1)前序遍歷

根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後,若其左孩子不為空,按相同規則訪問它的左子樹;當訪問其左子樹時,再訪問它的右子樹。因此其處理過程如下:

對於任一結點p:

1)訪問結點p,並將結點p入棧;

2)判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點p,迴圈至1);若不為空,則將p的左孩子置為當前的結點p;

3)直到p為null並且棧為空,則遍歷結束。

void

preorder2(bintree

*root)

//非遞迴前序遍歷 if(

!s.empty())

}}

(2)

中序遍歷

根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:

對於任一結點p,

1)若其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前結點p再進行相同的處理;

2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的p置為棧頂結點的右孩子;

3)直到p為null並且棧為空則遍歷結束

void

inorder2(bintree

*root)

//非遞迴中序遍歷if(

!s.empty())

}

}

(3)後序遍歷

要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

void

postorder3(bintree

*root)

//非遞迴後序遍歷

else

}

}

知識點總結 STL相關(持續補充)

恢復內容開始 vector是動態陣列,可以理解為是能夠根據需要隨時申請記憶體的動態陣列。常用操作如下 修改迭代器 元素訪問 示例 include using namespace std vector v 宣告部分 intmain 迭代器的用法 vector iterator it for it v....

Python json相關補充

參考 1.json.dumps 和json.loads 是json格式處理函式 可以這麼理解,json是字串 1 json.dumps 函式是將乙個python資料型別列表進行json格式的編碼 可以這麼理解,json.dumps 函式是將字典轉化為字串 2 json.loads 函式是將json格...

C 樹的相關知識

有4種遍歷二叉樹的常用方法 前序遍歷void preorder binarytreenode t 遞迴版 迭代使用棧來實現前序遍歷 void preorderiter treenode root 迭代版 stack stack stack.push root while stack.empty if...