二叉樹後根周遊的非遞迴演算法

2021-04-13 01:11:01 字數 2644 閱讀 7497

/* 二叉樹後根周遊的非遞迴演算法*/

#include "stdafx.h"

#include

#include

typedef char datatype;

struct bintreenode;                         /* 二叉樹中結點 */

typedef struct bintreenode *pbintreenode;   /* 結點的指標型別 */

int inum=0;

struct bintreenode ;

typedef struct bintreenode *bintree;

typedef bintree *pbintree;

typedef pbintreenode bnode;

pbintreenode root_btree(pbintree t)

pbintreenode leftchild_btree (pbintreenode p)

pbintreenode rightchild_btree (pbintreenode p)

/*以下演算法就是先將二叉樹擴充為擴充的二叉樹,

然後按先根次序周遊的順序輸入結點的資訊,

生成乙個雙鏈儲存的二叉樹的過程*/

/*pbintreenode create(pbintreenode t,int c)

else // 否則,按二叉排序樹的構造方法構造樹

// 此處已經退出 while(p!=0) 這個迴圈,表明已經找到輸入的結點合適的位置了,

// 這個位置或者是di的左孩子,或者是di的右孩子

if(c<(di->info)) // 如果輸入的結點比di小,將輸入的結點新增在di左孩子

else // 否則將輸入的結點新增在di的又孩子 }

++number; // 結點數+1

}while(c!=0);

printf("葉子的數量:%d",number);

return t;

} */

pbintreenode createrest_btree()

// pbnode->info = ch;

// pbnode->llink = createrest_btree(); /* 構造左子樹 */

// pbnode->rlink = createrest_btree(); /* 構造右子樹 */

//}//return pbnode;

int c=1;

int number=0;

pbintreenode  t=0;

pbintreenode  p,di; // p用來指向所要分配的結點,di用來指向p的雙親

do else // 否則,按二叉排序樹的構造方法構造樹

// 此處已經退出 while(p!=0) 這個迴圈,表明已經找到輸入的結點合適的位置了,

// 這個位置或者是di的左孩子,或者是di的右孩子

if(c<(di->info)) // 如果輸入的結點比di小,將輸入的結點新增在di左孩子

else // 否則將輸入的結點新增在di的又孩子 }

++number; // 結點數+1

}while(c!=0);

printf("葉子的數量:%d",number);

return t;

pbintree  create_btree( void ) */

*pbtree = createrest_btree( );  /* 遞迴建立從根開始的二叉樹 */

}return pbtree;

}void visit(bnode p)

printf("%d ",p->info);

}typedef struct elem;

/*棧順序表示*/

#define maxnum 20       /* 棧中最大元素個數 */

struct  seqstack ;

typedef struct seqstack *pseqstack; /* 順序棧型別的指標型別 */

/*建立乙個空棧;為棧結構申請空間,並將棧頂變數賦值為-1*/

pseqstack  createemptystack_seq( void )

/*判斷pastack所指的棧是否為空,為空棧時返回1,否則返回0*/

int isemptystack_seq( pseqstack pastack )

/* 在棧中壓入一元素x */

void push_seq( pseqstack pastack, elem x )

}/* 刪除棧頂元素 */

void  pop_seq( pseqstack pastack )

/* 假定pastack所指的棧不為空,求棧頂元素的值 */

elem  top_seq( pseqstack pastack )

void npostorder(pbintree t)

continueflag = 't';

while ( continueflag == 't' && !isemptystack_seq(st) )

else visit(p);

}} while (!isemptystack_seq (st)); /* 棧為空時,全部周遊完 */

}int main()

二叉樹非遞迴演算法

程式小白,希望和大家多交流,共同學習 非遞迴二叉樹借用棧 使用鏈棧,使用它的原因 1.需要使用先進後出的儲存結構 2.需要儲存資料個數不定 三種遍歷儲存的雖然都是相同的資料型別,但是使用的目的不一樣,所以使用的位置不一樣 先序遍歷 根據給定的根節點,直接訪問根節點 左結點,有左孩子的結點有兩重身份 ...

中根非遞迴遍歷二叉樹

在先根非遞迴中,根入棧後彈出,訪問,右孩子與左孩子進棧,順序很清楚。但是中根非遞迴與後根非遞迴中,根入棧後如果彈出不能訪問,這是乙個困惑的地方。為了更明晰地,更統一3種非遞迴設計思路。均可以採用入棧,彈出,左右子樹入棧這種基本步驟。每個步驟需要仔細在紙上演示設計。由於乙個節點出棧後還要進棧,該節點再...

先 中 後 遞迴,非遞迴 二叉樹

import com.ccut.aaron.stack.linkedstack public class binarytree 前序遍歷非遞迴的方式 public void preordernonrecursive binarytreenode root if stack.isempty break...