樹在資料結構是乙個極其重要的存在,例如二叉樹,排序二叉樹,平衡二叉樹,紅黑樹等等在許多專案中運用比較廣,而且也是平時考察的重點,所以今天就來系統地談一談樹
樹
定義:n個結點的有限集合,當n等於0時,稱為空樹,n個結點的樹只有n-1條邊,有如下性質。
有且僅有乙個特定的稱為根的結點
當n>1時,其餘結點可分為m個互不相交的有限集合,其中每乙個集合本身又是一顆樹,稱為根節點的子樹(n個結點的樹中只有n-1條邊)
樹中的乙個結點的子結點的個數稱為該結點的度,樹中最大度數稱為樹的度
度大於0的結點稱為分支節點,度為0的結點稱為葉子結點
結點的層次,結點的高度(是樹中結點的最大層數),結點的深度
有序樹和無序數
樹中兩個結點之間的路徑是由這兩個結點之間所經過的結點序列構成的
路徑長度:路徑上所經歷邊的個數
森林:m棵互不相交的樹的集合
樹中的結點數等於所有結點的度數加1
度為m的樹中第i層上至多有m**(i-1)個結點
高度為h的m叉結點至多有(m**h -1)/(m-1)個結點
具有n個結點的m叉樹的最小高度為[logm (n(m-1)+1)]
二叉樹
二叉樹是n(n=0)個結點的有限集合
基本形態
滿二叉樹:一棵高度為h,且含有2**h-1的結點的二叉樹為滿二叉樹(對於編號為i的結點,若存在,其雙親的編號為i/2,左孩子為2i,右孩子為2i+1)
完全二叉樹:設乙個高度為h,有n個結點的二叉樹,當且僅當每個結點都與高度為h的滿二叉樹中編號1~n的結點一一對應時,稱為完全二叉樹(相當於滿二叉樹的子集)
二叉樹的儲存結構
順序儲存:用陣列類似的一片連續的記憶體空間來儲存,若存在左孩子,則為2i,右孩子為2i+1
順序儲存最壞情況下會非常浪費記憶體空間,因此比較適合完全二叉樹。
鏈式儲存:用鍊錶來存放一顆二叉樹,二叉樹中每個結點用鍊錶的乙個鏈結點來儲存.
typedef
struct bitnode bitnode,
*bitree;
含有n個結點的鍊錶中,有n-1個空鏈域
二叉樹的遍歷
先序遍歷
根節點左子樹
右子樹
void
preorder
(bitree t)
}
中序遍歷
左子樹根節點
右子樹
void
inorder
(bitree t)
}
後序遍歷
左子樹右子樹
根節點
void
postorder
(bitree t)
}
中序遍歷非遞迴演算法
#include
void
inorder
(bitree t)
else
}}
層次遍歷
#include
void
levelorder
(bitree t)
if(b-
>rchild !=
nullptr)}
}
線索二叉樹對於二叉樹中的空指標域,為了不浪費記憶體,故使用線索化的線索二叉樹,基本原理:
若無左子樹,則將左指標指向前驅結點;
若無右子樹,則將右指標指向後驅結點;
待
資料結構之 樹
1.雙親表示法 下標 資料 parentid 2.孩子表示法 data child1 child2 child3 3.雙親孩子表示法 下標 parentid firstchildid secondchildid 節點 下標 next 頁的話next應該是null 4.孩子兄弟表示法 data 第一次...
資料結構之樹
一 樹的基本概念 樹 tree 是元素的集合,樹有多個節點可以儲存元素 二 二叉樹 每個節點最多有兩個子節點的樹稱為二叉樹 常用來做二分查詢 binary search 等 三 b樹 即二叉搜尋樹 binary search tree 是一種特殊形態的二叉樹 1 所有節點最多擁有2個子節點 2 所有...
資料結構之樹
樹是節點的有限集合.度 a的度是3 b的度是2 d的度是2 c的度為0 當前節點的直接分支 葉子 終端節點就是葉子 e f g h c 根 非終端節點就是根 a b d 有序樹 如果e f不可以隨意換順序 就是有序樹 無序樹 如果 e f可以隨意換順序而且不影響邏輯 祖先 對e來說 b,a都是祖先 ...