【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树
遞歸先序遍歷和中序遍歷
先序:
void preorder(bnode *t){if(t!=NULL){ visit(t);preorder(t->lchild); preorder(t->rchlid);} }中序:
void inorder(bnode *t){if(t!=NULL){inorder(t->lchild);visit(t);inorder(t->rchlid);}}后序:
void postorder (bnode *t){if(t!=NULL){postorder (t->lchild);postorder (t->rchlid); visit(t); }}打印二叉樹的結(jié)點以及先序遍歷的順序數(shù)
void printnode( bnode *T, int &k ) { //設(shè)調(diào)用時k對應(yīng)的實參初始化為0if ( T != NULL ) {k++;cout<<‘(’T->data<<‘,’<<k<<“), ”;printnode( T -> lchild, k );printnode( T -> rchild, k );}遞歸算法求結(jié)點數(shù) 2、設(shè)計算法求二叉樹的結(jié)點數(shù):
分析:
(1)設(shè)置一個全局變量,在遍歷二叉樹的過程中,對訪問的結(jié)點累計計數(shù)。
(2) 設(shè)函數(shù)void num( bnode *T )表示對以T為根的二叉樹遍歷和計數(shù),分析如下:
如果T == NULL ——結(jié)點數(shù)為0,不必累計;
否則 結(jié)點數(shù) = 左子樹結(jié)點數(shù) + 右子樹結(jié)點數(shù)+1。
可以設(shè)計為int型函數(shù)形式:
int num( bnode * T ) {if ( T == NULL ) return(0);else return num( T -> lchild ) + num( T -> rchild ) + 1;}遞歸構(gòu)造二叉樹
void create ( bitre *&T ){cin >> x;if ( x == ’.’ ) T = NULL;else{T = new bnode;T -> data = x;create ( T -> lchild );create ( T -> rchild );} }非遞歸的先序/中序/后續(xù)算法
先序:
用一個一維數(shù)組stack[maxnode]用以實現(xiàn)棧,變量top表示棧頂?shù)奈恢?/p>
int bitTree::PreOrder(bitTree bt){
//預(yù)先定義bitTree這一個結(jié)點類作為新數(shù)據(jù)類型
bitTree stack[maxnode],p;
int top;
if(bt==nullptr)return 1;//空樹時
else{
p=bt;//p首先為根節(jié)點
top=-1;//棧頂
while(!(p==NULL&&top==-1))
{
if(p!= NULL){
visit(p->data);//訪問p
top++;//棧頂加一
stack[top]=p;//先訪問結(jié)點,然后入棧,然后指向右孩子
p=p->lchild;
}
else{
p=stack[top];
top--;
p=p->rchild;//指向右孩子
}}
注意:中序遍歷則把visit(p->data);移到p=stack[top]和
p=p->rchild;之間。
后序遍歷的非遞歸:與先序 中序不同,后序遍歷過程中,結(jié)點第一次出棧后,還要再次入棧,即結(jié)點要入兩次棧,出兩次棧,而訪問結(jié)點是在第二次出棧時訪問。因此為了區(qū)別同一個結(jié)點指針的兩次出棧,設(shè)置一個標(biāo)志flag:flag為1表示第一次出棧,為2表示第二次出棧,此時可以訪問??梢詫V性財?shù)據(jù)類型定義為有指針域和標(biāo)志flag域的結(jié)構(gòu)體,如:
struct stacttype{
btTree link;
int flag;}
總結(jié)
以上是生活随笔為你收集整理的【笔记】二叉树递归算法和非递归算法的实现 先序/中序/后续遍历 打印结点以及顺序数 构造二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【jetson nano】ubuntu-
- 下一篇: 【笔记】顺序存储结构求二叉树深度