二叉樹的遍歷及應用
前言
二叉樹這種資料結構雖然能有特點的儲存資料,比如二叉搜尋樹(一種樹,左節點小於根節點,右節點大於根節點)和平衡二叉樹(二叉搜尋樹的升級,為了保證搜尋樹不失去平衡,變成連結串列,所以規定左右子樹高度差不能超過1),但是操作起來就有難度了,要找一個資料或者插入刪除,如何找到我們想找到的資料或者位置呢?由於非線性,所以遍歷起來要按照一定的規則,保證每個結點被訪問且只被訪問一次,其實就是把非線性結構變成線性,這裡用下圖所示樹來介紹前中後序三種遍歷方法。
先序遍歷
如果樹空返回NULL,否則按照 根結點->左子樹->右子樹 的順序來遍歷,程式碼實現如下
void PreOrderTraverse(BiTree T){
if(T){
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:ABDEHIJKCFG
中序遍歷
如果樹空返回NULL,否則按照 左子樹->根結點->右子樹 的順序來遍歷,程式碼實現如下
void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:DBHEJIKAFCG
後序遍歷
如果樹空返回NULL,否則按照 根結點->左子樹->右子樹 的順序來遍歷,程式碼實現如下
void PastOrderTraverse(BiTree T){
if(T){
PastOrderTraverse(T->lchild);
PastOrderTraverse(T->rchild);
cout<<T->data;
}
}
按照先序遍歷遍歷上圖所示的樹,得到訪問次序為:DHJKIEBFGCA
應用
先序遍歷的順序建立二叉連結串列
//申請節點空間T,賦值ch
//遞迴建立左右子樹
void CreatBiTree(BiTree &T){
cin>>ch;
if(ch=='#') T=NULL;
else{
T=new BiTNode;
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
先序複製二叉樹
void Copy(BiTree T,BiTree &NewT){
if(T==NULL){
NewT=NULL;
return ;
}else{
NewT=new BiTNode;
NewT->data=T->data;
Copy(T->lchild,NewT->lchild);
Copy(T->rchild,NewT->rchild);
}
}
後序計算二叉樹深度
int dep(BiTree T){
if(T==NULL) return 0;
else{
m=dep(T->lchild);
n=dep(T->rchild);
if(m>n)return (m+1);
else return (n+1);s
}
}
統計結點個數
int Count(BiTree T){
if(T==NULL) return 0;
else return (Count(T->rchild)+Count(T->lchild)+1);
}
統計度為1的結點
int NodeCount( BiTree T){
if(T==NULL) {
return 0;
}
if(T->lchild==NULL&&T->rchild!=NULL||T->rchild==NULL&&T->lchild!=NULL){
return 1+NodeCount(T->lchild)+NodeCount(T->rchild);
}
return NodeCount(T->lchild)+NodeCount(T->rchild);
}
統計度為2的結點
int NodeCount( BiTree T){
if(T==NULL) {
return 0;
}
if(T->lchild==NULL&&T->rchild!=NULL||T->rchild==NULL&&T->lchild!=NULL){
return 2+NodeCount(T->lchild)+NodeCount(T->rchild);
}
return NodeCount(T->lchild)+NodeCount(T->rchild);
}
相關文章
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- 二叉樹的遍歷二叉樹
- 二叉樹遍歷二叉樹
- 二叉樹---遍歷二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 二叉樹的遍歷及常用演算法二叉樹演算法
- 完全二叉樹的遍歷二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 二叉樹遍歷方法二叉樹
- 二叉樹遍歷 -- JAVA二叉樹Java
- C++樹——遍歷二叉樹C++二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 二叉樹的遍歷筆記二叉樹筆記
- 二叉樹的遍歷實現二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 線索二叉樹【定義、應用、線索化、遍歷】二叉樹
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 6.14-二叉樹遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 採用層次遍歷判斷二叉樹為完全二叉樹二叉樹
- 二叉樹的遍歷 (迭代法)二叉樹
- 144. 二叉樹的前序遍歷二叉樹
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹遍歷方法總結二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- 面試中很值得聊的二叉樹遍歷方法——Morris遍歷面試二叉樹
- Leetcode——144. 二叉樹的前序遍歷LeetCode二叉樹
- [LintCode]BinaryTreeLevelOrderTraversal(二叉樹的層次遍歷)二叉樹
- 二叉樹的先中後序遍歷二叉樹
- 二叉樹的先,中,後序遍歷二叉樹
- 二叉樹的前中後序遍歷二叉樹
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 從上到下遍歷二叉樹-Java二叉樹Java