二叉樹 四種遍歷及其他應用

2021-07-12 00:17:14 字數 3951 閱讀 3123

先序遍歷按照根結點->左孩子->右孩子的順序進行訪問。

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 ...