在電腦科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。
(1) 在非空二叉樹中,第i層的結點總數不超過2i−
12^2i−1
, i>=1;
(2) 深度為h的二叉樹最多有 2
h2^h
2h-1 個結點(h>=1),最少有h個結點;
(3) 對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0=n2+1;
(4) 具有n個結點的完全二叉樹的深度為[log2
n\log_2n
log2n
] + 1 (注:[ ]表示向下取整)
滿二叉樹:對於一棵二叉樹,如果每乙個非葉子節點都存在左右子樹,並且二叉樹中所有的葉子節點都在同一層中,這樣的二叉樹稱為滿二叉樹。
完全二叉樹:對於一棵具有n個節點的二叉樹按照層次編號,同時,左右子樹按照先左後右編號,如果編號為i的節點與同樣深度的滿二叉樹中編號為i的節點在二叉樹中的位置完全相同,則這棵二叉樹稱為完全二叉樹。
構建鏈式儲存結構:
public
class
binarytree
}
對於前序遍歷,首先遍歷根節點,其次遍歷左孩子,再遍歷右孩子,按照如此的順序遍歷整棵樹,其**如下:
/**
* 先序遍歷:根左右
** @param root
*/public
static
void
preorder
(binarytree root)
system.out.
print
(root.val +
",")
;preorder
(root.left)
;preorder
(root.right)
;}
對於中序遍歷,首先遍歷左子樹,其次遍歷父節點,最後遍歷右子樹,按照如此的順序遍歷整棵樹,其**如下:
/**
* 中序遍歷:左根右
** @param root
*/public
static
void
inorder
(binarytree root)
inorder
(root.left)
; system.out.
print
(root.val +
",")
;inorder
(root.right)
;}
對於後序遍歷,首先遍歷左子樹,其次遍歷右子樹,最後遍歷父節點,其**如下:
/**
* 後序遍歷:左右根
** @param root
*/public
static
void
postorder
(binarytree root)
postorder
(root.left)
;postorder
(root.right)
; system.out.
print
(root.val +
",")
;}
對於層次遍歷,需要使用鍊錶儲存每一層的節點,同時,遍歷完乙個節點,將其左右子節點增加近煉表中,其**為:
/**
* 層次遍歷
** @param root
*/public
static
void
levelorder
(binarytree root)
linkedlist
queue =
newlinkedlist
<
>()
; queue.
offer
(root)
;while
(!queue.
isempty()
)if(node.right != null)
}}
最終遍歷結果:
先序遍歷1,2,4,5,3,6,7,
中序遍歷
4,2,5,1,6,3,7,
後序遍歷
4,5,2,6,7,3,1,
層次遍歷
1,2,3,4,5,6,7,
二叉樹基礎
二叉樹 二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。二叉樹節點結構 二叉樹的建立 node createtree const t a,size t size,size t index,const t invilid return root 返回根節點 前序遍歷 前...
二叉樹基礎
最近學習的一些筆記,記錄一下 樹是一種非線性結構,樹 這種資料結構真的很像我們現實生活中的 樹 這裡面每個元素我們叫 節點 例如下面這幅圖,a 節點就是 b 節點的父節點,b 節點是 a 節點的子節點。b c d 這三個節點的父節點是同乙個節點,所以它們之間互稱為兄弟節點。我們把沒有父節點的節點叫作...
二叉樹基礎
1.二叉樹的定義 每個結點最多只有兩棵子樹 子樹左右有順序之分 2.常見的二叉樹型別 滿二叉樹 看起來 完美 而又 平衡 的樹 完全二叉樹 首先從上至下,從左至右按順序給結點編號,再從下至上,從右至左按順序刪除結點。由此可見滿二叉樹是一棵特殊的完全二叉樹,而完全二叉樹是 缺胳膊少腿 的滿二叉樹。3....