先序遍歷按照根結點->左孩子->右孩子
的順序進行訪問。
void preorder1(bitree *root)
}
根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後,若其左孩子不為空,按相同規則訪問它的左子樹;當訪問完其左子樹時,再訪問它的右子樹。因此其處理過程如下:
對於任一結點p:
1)訪問結點p,並將結點p入棧;
2)判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧
頂結點的右孩子置為當前的結點p,迴圈至1);若不為空,則將p的左孩子置為當
前的結點p;
3)直到p為null並且棧為空,則遍歷結束。
**:
void preorder2(bitree *root)
if(!s.empty())}}
中序遍歷按照左孩子-根結點-右孩子
的順序進行訪問。
void inorder1(bitree *root)
}
對於任一結點p,
1)若其左孩子不為空,則將p入棧並將p的左孩子置為當前的p,然後對當前結點p
再進行相同的處理;
2)若其左孩子為空,則取棧頂元素並進行出棧操作,訪問該棧頂結點,然後將當
前的p置為棧頂結點的右孩子;
3)直到p為null並且棧為空則遍歷結束
**:
void inorder2(bitree *root)
if(!s.empty())}}
後序遍歷按照左孩子-右孩子-根結點
的順序進行訪問。
void postorder1(bitree *root)
}
要保證根結點在左孩子和右孩子訪問之後才能訪問,因此:
1)對於任一結點p,先將其入棧。
2)如果p不存在左孩子和右孩子,則可以直接訪問它;或者p存在左孩子或者右孩
子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。
3)若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取
棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被
訪問。
**:
void postorder2(bitree *root)
else}}
分層遍歷該二叉樹,即從上到下按層次訪問該二叉樹(每一層可單獨輸出一行),每一層要求訪問的順序為從左到右。
利用圖的廣度優先搜尋,外加乙個queue實現。
遍歷時直接一行輸出,不分行列印
void layerorder1(bitree *root)
}
遍歷時按二叉樹的層次分行輸出
我們可以在遍歷當前層的時候,儲存下一層的節點數,只需要每次插入乙個節點的時候childnum++即可,這樣我們就知道下一層有幾個節點了,然後將childnum賦值給parentnum,開始新的一層遍歷,從佇列中取出parentnum個節點以後,也就知道這一層遍歷完了。
由於這是二叉樹,所以一開始的時候parentnum = 1, childnum = 0。
void layerorder2(bitree *root)
if(p->right)
parentnum--;
if(parentnum==0)}}
建立如下的二叉樹:
首先,輸出結果如下:
遞迴先序遍歷:12
4536
87非遞迴先序遍歷:12
4536
87遞迴中序遍歷:42
5168
37非遞迴中序遍歷:42
5168
37遞迴後序遍歷:45
2867
31非遞迴後序遍歷:45
2867
31層次遍歷方法一:12
3456
78層次遍歷方法二:12
3456
78process returned 0 (0x0) execution time : 0.465 s
press any key to continue.
**:
#include
#include
#include
using
namespace
std;
typedef
struct binarytreenode
btnode, bitree;
//建立二叉樹節點
btnode *createbtnode(int key)
void preorder1(bitree *root)
}void preorder2(bitree *root)
if(!s.empty())
}}void inorder1(bitree *root)
}void inorder2(bitree *root)
if(!s.empty())
}}void postorder1(bitree *root)
}void postorder2(bitree *root)
else
}}void layerorder1(bitree *root)
}void layerorder2(bitree *root)
if(p->right)
parentnum--;
if(parentnum==0)
若一棵二叉樹為空,則它的深度為0,否則它的深度等於左子樹和右子樹中的最大深度加1. 設nleft為左子樹的深度,nright為右子樹的深度,
則二叉樹的深度為:max(nleft , nright)+1.
//樹的深度
int treedepth(btree* root)
若存在,則由x帶回完整值並返回真,否則返回假。
該演算法類似於前序遍歷,若樹為空則返回false結束遞迴,若樹根結點的值就等於x的值,則把結點值賦給x後返回true結束遞迴,否則先向左子樹查詢,若找到則返回true結束遞迴,否則再向右子樹查詢,若找到則返回true結束遞迴,若左,右子樹均未找到則返回false結束遞迴。
bool findbtree(btreenode *bt , elemtype &x)
else
}
結果由函式返回。
此演算法也是乙個遞迴過程,若樹為空則返回0結束遞迴,若樹根結點的值等於x的值則返回左、右兩棵子樹中等於x結點的個數加1,否則只應返回左、右兩棵子樹中等於x結點的個數。
int countx(btreenode *bt , elemtype &x)
int nodelevel(btreenode *bt , elemtype &x)
}
elemtype maxvalue(btreenode *bt)
int btreecount(btreenode *bt)
int btreeleafcount(btreenode *bt)
參考: 二叉樹四種遍歷方式
二叉樹的四種遍歷方式 include include using namespace std 二叉樹節點的定義 class treenode 遞迴方式,每個結點只遍歷一次,時間複雜度o 1 遞迴最多呼叫n次,空間複雜度o n 先序 根 遞迴左 遞迴右 void preorder treenode r...
二叉樹及其應用 二叉樹遍歷
給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...
二叉樹的四種遍歷方式
前言最近做題用到很多次二叉樹的遍歷,因此寫這篇文章記錄二叉樹的四種遍歷方式。首先為了方便,先假設二叉樹的結構如下 struct treenode 對於程式的輸入為 3 根節點root 9 20 4 10 15 71.二叉樹的層次遍歷 層次遍歷就是依次遍歷樹的每一層。借助佇列,可以輕鬆實現。void ...