\(二叉樹的每個節點最多只有 2 個子樹 (不存在度 >2 的節點) 有左右之分,不可以顛倒\)
\(二叉樹的第 i 層最多有 2^個結點\)
\(設二叉樹的深度為 k 則: 二叉樹最多有 2^-1 個結點\)
\(對任何一棵二叉樹 t ,設其葉節點數為 n_ 其度為 2 的結點個數為 n_ 則:n_ = n + 1\)
滿二叉樹:
滿二叉樹示意圖
$深度為 k 且有 2^-1 個結點,就是一棵滿二叉樹,滿二叉樹的每一層都是滿的$
完全二叉樹:
完全二叉樹示意圖
$除最後一層外,其他層都是滿的,或在右邊連續缺少若干結點,就是一棵完全二叉樹,設有 n 個結點的完全二叉樹的深度為log_(n+1)$
$深度為 k 的完全二叉樹,至少 2^ 個結點,最多 2^-1 個結點$
二叉搜尋樹:
二叉搜尋樹示意圖
排序二叉樹有如下性質
- $若左子樹不空,則左子樹上所有節點均小於根節點的值$
- $若右子樹不空,則右子樹上所有節點均大於根節點的值$
- $左右子樹也都是二叉搜尋樹$
- $二叉搜尋樹可以為空樹$
- 先序遍歷
$先序遍歷是指先訪問根節點,再依次訪問左子樹和右子樹$
- 中序遍歷
$中序遍歷是指先訪問左子樹,再依次訪問根節點和右子樹$
- 後序遍歷
$先序遍歷是指先訪問左子樹和右子樹,最後再訪問根節點$
- 層次遍歷
$跟「擴充套件式廣度優先搜尋(俗稱「廣搜」)相同」$
int son[n][2], root;
vectorv1, v2, v3, v4;
//先序遍歷
void preorder(int u)
//中序遍歷
void inorder(int u)
//後序遍歷
void postorder(int u)
//層次遍歷
void levelorder()
} ```
## 根據遍歷結果復原二叉樹:
注意!先序遍歷和後序遍歷不能確定唯一的二叉樹!
對於先序遍歷和中序遍歷,我們只需在先序遍歷中確定根節點,並且靠中序遍歷找出其位置,再依次還原左子樹和右子樹,即可確定二叉樹。
對於後序遍歷和中序遍歷,也可按照同樣的方法進行還原,確定唯一的二叉樹。
```cpp
// a陣列為中序遍歷,b陣列為先序遍歷
// x1、y1為當前子樹在a陣列中下標的範圍,x2為前子樹在b陣列中下標的起點
int a[n], b[n], son[n][2];
void dfs(int x1, int y1, int x2)
int len1 = pos - x1, len2 = y1 - pos; // 在中序遍歷裡確定當前子樹的左子樹和右子樹大小
if (len1 > 0)
if (len2 > 0)
}
二叉樹性質
1.在二叉樹的第i層上最多有2i 1 個節點 i 1 用歸納法證明 歸納基 i 1 層時,只有乙個根結點,2i 1 20 1 歸納假設 假設i k時,命題成立 歸納證明 二叉樹上每個結點至多有兩棵子樹,則 第 k 1 層的結點數 最多為2k 1 x 2 2k 1 1 2.二叉樹中如果深度為k,那麼最...
二叉樹性質
二叉樹有以下幾個性質 todo 上標和下標 性質1 二叉樹第i層上的結點數目最多為2 i 1 性質2 深度為k的二叉樹至多有2 1個結點 k 1 性質3 包含n個結點的二叉樹的高度至少為log2 n 1 性質4 在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0 n2 1。2....
二叉樹性質
1 第n層 n 1 上至多有2 n 1 個節點。第一層為 1 2 0 第二層為 2 2 1 第三層為 4 2 2 第i層為 2 n 1 2 深度為k時,至多有2 k 1個節點 k 1 由 1 可知用等比數列前n項和求出。3 具有n個節點的完全二叉樹的深度為k log n 1.k層完全二叉樹,就是前 ...