2 二叉樹
樹是一種非線性結構。樹上的任意節點,就只有乙個父節點,可以有多個子節點。
節點的度:乙個節點含有的子樹的個數稱為該節點的度;
樹的度:一棵樹中,最大的節點的度稱為樹的度;
葉子節點或終端節點:度為0的節點稱為葉子節點;
雙親節點或父節點:若乙個節點含有子節點,則這個節點稱為其子節點的父節點;
孩子節點或子節點:乙個節點含有的子樹的根節點稱為該節點的子節點;
根結點:一棵樹中,沒有雙親結點的結點;
節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
樹的高度或深度:樹中節點的最大層數;
兄弟節點:具有相同父節點的節點互稱為兄弟節點;
堂兄弟節點:雙親在同一層的節點互為堂兄弟:
節點的祖先:從根到該節點所經分支上的所有節點(不是乙個節點,而是一組節點);
子孫:以某節點為根的子樹中的任一節點都稱為該節點的子孫;
森林:由 m ( m >= 0 ) 棵互不相交的樹的集合稱為森林;
檔案系統管理(目錄和檔案的管理)
樹的度為 2 ,就叫做二叉樹。
1、每個節點最多有兩棵子樹,即 二叉樹不存在度大於 2 的節點;
2、二叉樹的子樹有左右之分,其子樹的次序不能顛倒( 顛倒之後就是不同的樹了 ),因此二叉樹是有序樹。
1、滿二叉樹:即每一層的節點都達到了最大值,每乙個節點的度要麼是 2 要麼是 0 。
2、完全二叉樹:由滿二叉樹引出來的,對於深度為 k,有 n 個節點的二叉樹,當且僅當其中每乙個節點都與深度為 k 的滿二叉樹中編號從 1 到 n 的節點一一對應的時稱為完全二叉樹,滿二叉樹是一種特殊的完全二叉樹。
1、若規定根節點的層數為1,則一棵非空二叉樹的第 i 層上最多有 2i−
12^2i−1
(i>0)個結點;
2、若規定只有根節點的二叉樹的深度為1,則深度為k的二叉樹的最大結點數是 2k−
12^k-1
2k−1
(k>=0);
3、 對任何一棵二叉樹, 如果其葉結點個數為 n0, 度為2的非葉結點個數為 n2,則有 n0=n2+1;
4、具有n個結點的完全二叉樹的深度k為 log
2(n+
1)log_2(n+1)
log2(
n+1)
上取整;
5、對於具有n個結點的完全二叉樹,如果按照從上至下從左至右的順序對所有節點從0開始編號,則對於序號為i的結點有:
假設父節點的編號是 i,則左孩子節點的編號的是 (2i + 1);右孩子節點的編號就是 (2i + 2)。
// 孩子表示法
class
node
}// 孩子雙親表示法
class
node2
}
先建立乙個如下圖的二叉樹
四種遍歷方式:
1.先序遍歷 ( 根左右 ) :先訪問 ( visit ) 根節點,然後遍歷左子樹,然後遍歷右子樹;
public
void
preorder
(node root)
system.out.
print
(root.val)
;preorder
(root.left)
;preorder
(root.right)
;}
2.中序遍歷 ( 左根右 ) :先遞迴遍歷左子樹,然後訪問根節點,然後遞迴遍歷右子樹;
public
static
void
inorder
(node root)
inorder
(root.left)
; system.out.
print
(root.val)
;inorder
(root.right)
;}
3.後序遍歷 ( 左右根 ) :先遞迴遍歷左子樹,然後遞迴遍歷右子樹,然後訪問根節點;
public
static
void
postorder
(node root)
postorder
(root.left)
;postorder
(root.right)
; system.out.
print
(root.val)
;}
4.層序遍歷 :按照從上到下,從左到右的順序遍歷。
方法一:
// 這個方法使用 count 來記錄節點的個數
// 但是,注意當有多個樹時,它求出的是累加的節點數,這時就會出現問題
public
static
int count =0;
public
static
void
length
(node root)
count ++
;length
(root.left)
;length
(root.right)
;}
方法二:
// 這個方法可以避免上個方法會出現的問題
public
static
intlength2
(node root)
return1+
length2
(root.left)
+length2
(root.right)
;}
public
intgetklevelsize
(node root,
int k)
if(k ==1)
return
getklevelsize
(root.left,k -1)
+getklevelsize
(root.right,k -1)
;}
k 層節點數 = 左子樹 k - 1 層節點個數 + 右子樹 k - 1 層節點個數,具體根據我們建立的這棵樹來解釋就是如下:
a 的第三層的節點數 = b 的第二層節點個數 + c 的第二層節點個數 = d 的第一層節點個數 + e 的第一層節點個數 + f 的第一層節點個數。(第一層就是當前層)
a 的高度 = 1 + ( b的高度和c的高度的較大值 )
public
static
intgetheight
(node root)
int leftheight =
getheight
(root.left)
;int rightheight =
getheight
(root.right)
;return1+
(leftheight > rightheight ? leftheight : rightheight)
;}
遍歷二叉樹,查詢與要找元素相同的元素
public
static node find
(node root,string tofind)
if(root.val.
equals
(tofind)
) node ret =
find
(root.left,tofind);if
(ret != null)
return
find
(root.right,tofind)
;}
二叉樹及其基本操作
名稱 二叉樹及其基本操作 說明 最近重新學習了二叉樹,多了乙個緯度,我去難度可不是上公升乙個層次。磨磨蹭蹭慢慢悠悠的把基本操作敲完了。在此記錄一下。二叉樹的儲存結構 typedef struct bitnode bitnode,bitree 初始化 void inittree bitree t,in...
二叉樹的建立及其基本操作
實驗內容 1 按照前序次序建立一棵二叉樹 2 用前 中 後序遞迴遍歷的方法遍歷二叉樹 3 求二叉樹的深度 4 求二叉樹的所有結點數 實驗基本要求 掌握二叉樹的鏈式儲存結構的建立方法和對二叉樹的各種操作演算法 include include define maxsize 100 typedef cha...
二叉樹及其基本操作(二)(C語言)
前面我們知道了二叉樹的相關概念和性質,也了解了二叉樹的相關遍歷方法,接下來我們來實現一下其他的有關二叉樹的相關基本操作。二叉樹及其基本操作 一 c語言遞迴實現前中後層序遍歷 求二叉樹節點個數 int treesize1 treenode root 方法1 遞迴 if root lchild null...