二叉樹樹是一種常用的非線性結構,其遞迴定義如下:
樹是n(n>=0)個結點的有限集合。若n=0,則稱為空樹,否則,有且僅有乙個特定的結點被稱為根,當n>1時,其餘結點被分為m個互不相交的子集,每個子集又是一棵樹。
常見樹結構
組織機構關係
血緣關係
樹的組織
檔案系統
結點資料元素的內容及其指向其子樹根的分支統稱為結點。
結點的度
乙個結點所擁有的分支數。
樹的度所有結點的度的最大值。
終端結點(葉子)
度為0的結點。
非終端結點
度不為0的結點。
結點的層次
樹的深度
有序樹、無序樹
如果樹中每棵子樹從左向右的排列擁有一定的順序,不得互換,則稱為有序樹,否則為無序樹。
二叉樹是另一種樹形結構
二叉樹與樹形結構的區別
每個節點最多有兩顆子樹
子樹有左右之分
二叉樹的遞迴定義
二叉樹是n(n>=0)個結點的有限集合。當n=0時,稱為空二叉樹;當n》0時,有且僅有乙個結點為二叉樹的根,其餘結點被分兩個不相交的子集,乙個為左子集乙個為右子集。
滿二叉樹
完全二叉樹
用一組連續的儲存單元按照完全二叉樹的每個結點編號的順序存放結點內容。
二叉樹的鏈式儲存結構
順序儲存的不足
① 對於非完全二叉樹,進行順序儲存需要將空缺的位置用特定的符號填補,如果空缺結點較多,則導致空間利用率下降;
② 僅適用於完全二叉樹。
鏈式儲存
二叉鍊錶
三叉鍊錶
鏈式儲存結構描述
//二叉鍊錶儲存
typedef
struct bbtnodebbtnode;
//三叉鍊錶儲存
二叉樹是一種非線性的資料結構,在對它進行操作時,需要逐一對每個資料元素實施操作。
所謂遍歷二叉樹就是按照某種順序訪問二叉樹中的每乙個結點一次且僅一次,的過程。這裡的訪問可以是輸出、比較、更新、檢視元素內容等等操作。
① 遍歷操作實際上是將非線性結構線性化的過程;
② 遍歷操作是乙個遞迴的過程。
二叉樹的遍歷方式分為兩大類
① 按照根、左子樹、右子樹三部分進行訪問:先序遍歷;中序遍歷;後續遍歷;
//先序遍歷
void
preorder
(bbtnode *bt)
}//中序遍歷
void
inorder
(bbtnode *bt)
}//後續遍歷
void
postorder
(bbtnode *bt)
}
② 按照層次進行訪問
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
}return ret;}}
;
統計葉子結點個數
//統計葉子結點數
int n2=0;
void
countleafnode
(btnode *p)
}
計算二叉樹的高度
int
height
(bbtnode* bt)
else+1
}}
交換二叉樹左右子樹
void
exchange
(bbtnode* bt)
}
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...