/* 二叉樹後根周遊的非遞迴演算法*/
#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...