二叉樹及其各種遍歷

2021-06-29 14:05:48 字數 3912 閱讀 8767

**:

樹形結構是一類重要的非線性資料結構,其中以樹和二叉樹最為常用。

二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i -1次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹t,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。

二叉樹的鏈式儲存結構是一類重要的資料結構,其形式定義如下:

[cpp]view plain

copy

//二叉樹結點

typedef

struct

bitnodebitnode,*bitree;  

二叉樹的建立:

通過讀入乙個字串,建立二叉樹的演算法如下:

[cpp]view plain

copy

//按先序序列建立二叉樹

intcreatebitree(bitree &t)  

else

return

0;  

}  

二叉樹的遍歷:

遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每乙個結點都被訪問一次,而且只被訪問一次。由於二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結點轉換成為乙個線性序列來表示。

遞迴演算法:

[cpp]view plain

copy

//輸出

void

visit(bitree t)  

}  //先序遍歷

void

preorder(bitree t)  

}  //中序遍歷

void

inorder(bitree t)  

}  //後序遍歷

void

postorder(bitree t)  

}  

非遞迴演算法:

<1>先序遍歷:

【思路】:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

[cpp]view plain

copy

/* 先序遍歷(非遞迴)

思路:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

*/void

preorder2(bitree t)  

else

}//while

}  

<2>中序遍歷

【思路】:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。

先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。

[cpp]view plain

copy

void

inorder2(bitree t)  

else

}//while

}  

<3>後序遍歷

【思路】:t是要遍歷樹的根指標,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。

[cpp]view plain

copy

//後序遍歷(非遞迴)

typedef

struct

bitnodepostbitnodepost,*bitreepost;  

void

postorder2(bitree t)  

//左右子樹訪問完畢訪問根節點

while

(!stack.empty() && (stack.top())->tag == 

'r')  

//遍歷右子樹

if(!stack.empty())  

}//while

}  

<4>層次遍歷

【思路】:按從頂向下,從左至右的順序來逐層訪問每個節點,層次遍歷的過程中需要用佇列。

[cpp]view plain

copy

//層次遍歷

void

levelorder(bitree t)  

//右子樹不空,將右子樹入隊

if(p->rchild != null)  

}  }  

測試用例:

輸入:abc##de#g##f###

輸出:

**:[cpp]view plain

copy

#include

#include

#include

using

namespace

std;  

//二叉樹結點

typedef

struct

bitnodebitnode,*bitree;  

//按先序序列建立二叉樹

intcreatebitree(bitree &t)  

else

return

0;  

}  //輸出

void

visit(bitree t)  

}  //先序遍歷

void

preorder(bitree t)  

}  //中序遍歷  

void

inorder(bitree t)    

}    

//後序遍歷

void

postorder(bitree t)  

}  /* 先序遍歷(非遞迴)

思路:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

*/void

preorder2(bitree t)  

else

}//while

}  /* 中序遍歷(非遞迴)

思路:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。

先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。

*/void

inorder2(bitree t)  

else

}//while

}  //後序遍歷(非遞迴)

typedef

struct

bitnodepostbitnodepost,*bitreepost;  

void

postorder2(bitree t)  

//左右子樹訪問完畢訪問根節點

while

(!stack.empty() && (stack.top())->tag == 

'r')  

//遍歷右子樹

if(!stack.empty())  

}//while

}  //層次遍歷

void

levelorder(bitree t)  

//右子樹不空,將右子樹入隊

if(p->rchild != null)  

}  }  

intmain()  

二叉樹及其遍歷

滿二叉樹肯定是完全二叉樹,完全二叉樹不一定是滿二叉樹 二叉樹的遍歷 先序遍歷 也叫做先根遍歷 前序遍歷,首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹,如果二叉樹為空則返回。中序遍歷 首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。...

二叉樹及其遍歷

二叉樹是乙個很重要的儲存結構,所以和大家分享一下我對二叉樹的理解並結合 希望讓大家都能對二叉樹有乙個最清晰的認識 首先,二叉樹是每個節點最多有兩個子樹的樹結構,這是二叉樹的定義,二叉樹的結構如下圖 可以看到二叉樹必要的是根節點,也就是a,每個節點都會有左子節點和右子節點,那麼從b開始看,它又是乙個二...

二叉樹及其應用 二叉樹遍歷

給定二叉樹的廣義表表示,構造二叉樹並輸出二叉樹的四種遍歷順序。輸入說明 輸入僅一行,該行僅由 以及大小寫字元構成的二叉樹的廣義表表示,字串長度不超過100。輸出說明 在接下來的四行中依行輸出二叉樹的四種遍歷 輸入樣列 a b d,c e,f h 輸出樣列 abdcefh dbaecfh dbehfc...