二叉樹建立 遍歷

2021-08-09 22:21:33 字數 3189 閱讀 3561

#include

#include

#include

#include

using namespace std;

typedef struct node

char ch;

struct node *lchild,*rchild;

}bitnode,*bitree;

int treenum=0;//總結點數

void create(bitree &t)//先序建立

char c;

cin>>c;

if(c=='#')

t=null;//空樹

else

t=new bitnode;//等價於

t=(bitree)malloc(sizeof(bitnode))

t->ch=c;

create(t->lchild);//訪問左孩子

create(t->rchild);//訪問右孩子

void show1(bitree t)//遞迴先序

if(t)

coutshow1(t->lchild);

show1(t->rchild);

void show2(bitree t)//遞迴中序

if(t)

show2(t->lchild);

coutshow2(t->rchild);

void show3(bitree t)//遞迴後序

if(t)

show3(t->lchild);

show3(t->rchild);

coutint num1(bitree t)//求結點數

if(t)

treenum++;//不為空+1

num1(t->lchild);

num1(t->rchild);

return 0;

/*int num1(bitree t)//求葉子結點數

num1(t->lchild);

num1(t->rchild);

}return 0;

}//沒有孩子(出度為0)即為葉子結點*/

int num2(bitree t)//求深度

int l=0,r=0,level=0;

if(t)

l=num2(t->lchild);

r=num2(t->rchild);

level=max(l,r);

return level+1;//返回大的深度

+1(根結點)

return 0;

void show4(bitree t)//非遞迴先序

stackst;

bitree p=t;

while(p||!st.empty())//棧非空或p不空

if(p)

st.push(p);//入棧

coutp=p->lchild;//指向左孩子

else

p=st.top();//p指向棧頂元素

//cout<<"*"st.pop();//刪除棧頂元素

p=p->rchild;//指向右孩子

void show5(bitree &t)//非遞迴中序

stackst;

bitree p=t;

while(p||!st.empty())

if(p)

st.push(p);

p=p->lchild;

else

p=st.top();

coutst.pop();

p=p->rchild;

void show6(bitree &t)//非遞迴後序

stackst;

int flag[100];//設定乙個標記

bitree p=t;

while(p)//p不為空

st.push(p);//入棧

flag[st.size()]=0;//初始標記設為0

p=p->lchild;//指向左孩子

while(!st.empty())//棧不為空

p=st.top();//p指向棧頂元素

while(p->rchild&&flag[st.size()]==0)//p有右孩子且標記為0

p=p->rchild;

flag[st.size()]=1;//標記為1

while(p)//p不為空

st.push(p);//入棧

flag[st.size()]=0;//標記清零

p=p->lchild;

p=st.top();//p指向棧頂元素

coutst.pop();//清除棧頂元素

void show7(bitree &t)//層次遍歷

queuequ;

bitree p=t;

qu.push(p);//入佇列

while(!qu.empty())

p=qu.front();//p指向隊頭元素

coutqu.pop();//出佇列

if(p->lchild)

qu.push(p->lchild);

if(p->rchild)

qu.push(p->rchild);

int main()

//輸入

:abdg##h###ce#i##f##

//輸入

:- + a # # * b # # - c # # d # # / e # # f # #

bitree t;//等價於

bitnode *t

cout<<"請按先序序列輸入包含空結點的二叉樹(空結點用『

#』表示):

"<

create(t);

cout<<"二叉樹建立完成!

"<

cout<<"先序遍歷輸出二叉樹(遞迴):

"<

show1(t);

cout"<

show2(t);

cout"<

show3(t);

coutnum1(t);

coutcout"<

show4(t);

cout"<

show5(t);

cout"<

show6(t);

cout"<

show7(t);

cout

二叉樹的建立 遍歷1 建立二叉樹

談二叉樹,如果二叉樹都沒有正確的建立出來,那豈不是紙上談兵!括號表示式 表示方法 1.括號 括號內的東西是括號前的元素的孩子 2.逗號 逗號是為了區分左右孩子 演算法分析 給出乙個如上的括號表示式 a b d g e,f 再利用棧這個資料結構,分析一下 掃瞄整個括號表示的字串,這個字串中只有四種字元...

二叉樹的建立與遍歷 二叉樹遍歷模板)

初學二叉樹,感覺之前鍊錶掌握不熟練導致接受有點難,現在做一些總結。本題其實就是根據給出的前序遍歷 包括空子樹 寫出相應的前序 中序和後序遍歷。廢話不多說,先看看題目 description 下面給出了教材中演算法6.4所示的演算法。status createbitree bitree t retur...

二叉樹 二叉樹遍歷 根據先序建立二叉樹

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結輸入 輸入包括1行字串,長度不超過100。輸出 可能有多組測試資...