简述数据字典的结构及其作用_数据结构——树基本概念及其遍历
樹
1.概念
樹結構是一種描述非線性層次關系的數據結構
在一個數結構中,有且僅有一個結點沒有直接前驅,這個結點就是樹的結點。
除根結點外,其余每個結點有且僅有一個直接前驅。
每個結點可以有任意多個直接后繼。
2.樹的術語
根:有且僅有一個無直接前驅結點的結點
結點的度:結點擁有的子數的數量叫做結點的度
樹的度:樹內結點的度的最大值
葉子:終端結點
結點的層:從根算起。根為第一層,往下則+1層
樹的深度:樹的最大層數
森林:去掉根結點所得子數的個數
這里給大家分享一份二叉樹與紅黑樹電子書籍及視頻學習,需要的朋友可以加qun720209036獲取
3.二叉樹
什么是二叉樹
結點最多只有兩個兒子,叫做二叉樹二叉樹的重要性質
第i層上最多有2^(i-1)個結點
深度為k的的二叉樹最多有2^k - 1個結點
N0表示葉結點個數,N2表示度為2的非葉結點個數,那么N0=N2+1
二叉數的存儲
順序存儲:一般通過結構數組進行存儲
鏈式存儲:存儲結構包含結點元素及分別指向左子樹和右子樹的引用
//鏈式存儲typedef struct treeNode
{
void* NodeData; // 元素數據
struct treeNode* LtreeNode; //左子樹結點引用
struct treeNode* RtreeNode; // 右子樹結點引用
}TreeNode_T;
二叉樹的遍歷
先序遍歷:1.訪問根結點 2.訪問椰子樹 3.訪問右子樹
中序遍歷:1.訪問左子樹 2.訪問根結點 3.訪問右子樹
后序遍歷:1.訪問左子樹 2.訪問右子樹 3.訪問根結點
層次遍歷:從根結點開始,向下一層一層訪問,每層從左到右訪問每個結點
如何具體實現?首先需要分析,二叉樹遍歷的核心問題,需要存儲結構保存暫時不訪問的結點,可以借助其他數據結構完成,如隊列、堆棧
二叉樹的先、中、后序遞歸遍歷
核心思想:使用堆棧,先進后出二叉樹的層次遍歷
核心思想:使用隊列,先進先出,首先根結點入隊,當結點出隊,訪問該結點、將其左右兒子入隊偽代碼實現如下
先序遍歷的遞歸實現
void PreOrderTraversal( BinTree BT){
if( BT ){
printf("%d",BT->Data);
PreOrderTraversal( BT->left);
PreOrderTraversal( BT->right);
}
}
先序遍歷的非遞歸實現
void InOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S = CreatStack(MaxSize);
while(T || !IsEmpty(S) ){
while(T){ //向左一直壓棧
printf("%d",T->Data); //訪問
Push(S,T);
T = T->Left;
}
if( !IsEmpty(s) ){
T=Pop(s); //結點彈出堆棧
T = T->Righr; //轉向右結點
}
}
}
中序遍歷的遞歸實現
void PreOrderTraversal( BinTree BT){
if( BT ){
PreOrderTraversal( BT->left);
printf("%d",BT->Data);
PreOrderTraversal( BT->right);
}
}
中序遍歷的非遞歸實現
void InOrderTraversal(BinTree BT){
BinTree T=BT;
Stack S = CreatStack(MaxSize);
while(T || !IsEmpty(S) ){
while(T){ //向左一直壓棧
Push(S,T);
T = T->Left;
}
if( !IsEmpty(s) ){
T=Pop(s); //結點彈出堆棧
printf("%d",T->Data); //訪問
T = T->Righr; //轉向右結點
}
}
}
后序遍歷的遞歸實現
void PreOrderTraversal( BinTree BT){
if( BT ){
PreOrderTraversal( BT->left);
PreOrderTraversal( BT->right);
printf("%d",BT->Data);
}
}
總結
以上是生活随笔為你收集整理的简述数据字典的结构及其作用_数据结构——树基本概念及其遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python绘制饼图explode_py
- 下一篇: wxpython 优秀的界面_wxPyt