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(2)preorder2(bintree
*root)
//非遞迴前序遍歷 if(
!s.empty())
}}
中序遍歷
根據中序遍歷的順序,對於任一結點,優先訪問其左孩子,而左孩子結點又可以看做一根結點,然後繼續訪問其左孩子結點,直到遇到左孩子結點為空的結點才進行訪問,然後按相同的規則訪問其右子樹。因此其處理過程如下:
對於任一結點p,
1)若其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前結點p再進行相同的處理;
2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當前的p置為棧頂結點的右孩子;
3)直到p為null並且棧為空則遍歷結束
void(3)後序遍歷inorder2(bintree
*root)
//非遞迴中序遍歷if(
!s.empty())
}
}
要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。
voidpostorder3(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...