数据结构之二叉树的逻辑结构和遍历
生活随笔
收集整理的這篇文章主要介紹了
数据结构之二叉树的逻辑结构和遍历
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二叉樹的邏輯結構和遍歷
- 二叉樹的順序存儲:
- 二叉樹的順序存儲的缺點:
- 二叉樹的鏈式存儲(常):
- 二叉樹鏈式的代碼定義:
- 二叉樹的遍歷方法:
- 先序遍歷:
- 中序遍歷:
- 后序遍歷:
- 層次遍歷:
- 遍歷序列轉二叉樹:
- 先序遍歷序列+中序遍歷序列:
- 后序遍歷序列+中序遍歷序列:
- 層次遍歷序列+中序遍歷序列:
二叉樹的順序存儲:
前提: 是完全二叉樹
問題: 用一塊連續的存儲單元(數組)存儲節點元素,怎么才能體現樹的邏輯結構呢(怎么體現1是23的雙親節點,23是1的孩子節點)?
答: 利用了完全二叉樹的性質,可以通過數組下標找到某個節點的雙親節點或孩子節點。(2節點的孩子節點是數組下標為4和5的節點)
問題: 非完全二叉樹怎么實現順序存儲呢?
答: 將非完全二叉樹補成完全二叉樹即可,將補上去的節點數組對應位置置0。
二叉樹的順序存儲的缺點:
會浪費大量的存儲空間,這種存儲方式比較適合完全二叉樹
二叉樹的鏈式存儲(常):
問題: 空指針域與非空指針域的關系
二叉樹鏈式的代碼定義:
typedef struct BiTNode{ElemType data;struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;二叉樹的遍歷方法:
先序遍歷:
遞歸實現:
棧的實現:
中序遍歷:
遞歸實現:
棧的實現:
后序遍歷:
遞歸實現:
層次遍歷:
//初始時將根入隊并訪問根節點,然后出隊 //若有左子樹,則將左子樹的根入隊 //若有右子樹,則將右子樹的根入隊 //然后出隊,訪問該節點 //反復該過程直到隊列空為止 void LevelOrder(BiTree T){InitQueue(Q);BiTree p;EnQueue(Q,T);while(!isEmpty(Q)){DeQueue(Q,p);visit(p);if(p->lchild != NULL)EnQueue(Q,p->lchild);if(p->rchild != NULL)EnQueue(Q,p->rchild);} }遍歷序列轉二叉樹:
先序遍歷序列+中序遍歷序列:
后序遍歷序列+中序遍歷序列:
層次遍歷序列+中序遍歷序列:
ps: 后序遍歷序列+前序遍歷序列不能唯一確定一顆二叉樹
總結
以上是生活随笔為你收集整理的数据结构之二叉树的逻辑结构和遍历的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一. MyBatis系列:第一个MyBa
- 下一篇: 好久没有深入研究技术了,最近这两年太忙但