#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。輸出 可能有多組測試資...