資料結構作業——————二叉樹的三種遍歷方式
阿新 • • 發佈:2018-11-07
資料結構作業:
L:遍歷左子樹
D:訪問根節點
R:遍歷右子樹
DLR:先序遍歷
LDR:中序遍歷
LRD:後序遍歷
#include<bits/stdc++.h>
using namespace std;
typedef char ElemType;//節點儲存資料的型別,我讓節點儲存字元型資料
struct node{
ElemType data;//資料域
node *lchild,*rchild;//兩個指標域,二叉連結串列儲存二叉樹
};
void merge_tree (node *p,node *l,node *r)//p:父親,l:left_child左兒子,r:right_child:右兒子
{
p->lchild = l;
p->rchild = r;
}
node *create_node(ElemType data)//建立節點,返回一個node指標
{
node *p = new node;
p->data = data;
p->lchild = p->rchild =0;
return p;
}
void InOrderTraverse (node *t)//老師的程式碼,先序遍歷
{
if(t)
{
InOrderTraverse(t->lchild);//遍歷左子樹
cout<<t->data<<" ";//訪問根節點
InOrderTraverse(t->rchild);//遍歷右節點
}
}
void DLR(node *t)//先序遍歷
{
if(t)
{
cout<<t-> data<<" ";//訪問根節點
DLR(t->lchild);//遍歷左子樹
DLR(t->rchild);//遍歷右子樹
}
}
void LDR(node *t)//中序遍歷
{
if(t)
{
LDR(t->lchild);
cout<<t->data<<" ";
LDR(t->rchild);
}
}
void LRD(node *t)//後序遍歷
{
if(t)
{
LRD(t->lchild);
LRD(t->rchild);
cout<<t->data<<" ";
}
}
int main()
{
/*
建立節點
*/
node *a=create_node('a');
node *b=create_node('b');
node *c=create_node('c');
node *d=create_node('d');
node *e=create_node('e');
node *f=create_node('f');
node *g=create_node('g');
/*
建立樹
a
/ \
b c
/ \ / \
d e f g
先序遍歷:a b d e c f g
中序遍歷:d b e a f c g
後序遍歷:d e b f g c a
*/
merge_tree(a,b,c);
merge_tree(b,d,e);
merge_tree(c,f,g);
/*
遍歷樹
*/
cout<<"先序遍歷:";
DLR(a);
cout<<endl;
cout<<"中序遍歷:";
LDR(a);
cout<<endl;
cout<<"後序遍歷:";
LRD(a);
cout<<endl;
return 0;
}
三個節點形成的二叉樹有五種形式:(空代表節點不存在)
第一種:
- 先序遍歷:a b c
- 中序遍歷:b a c
- 後序遍歷:b c a
第二種:
- 先序遍歷:a b c
- 中序遍歷:c b a
- 後序遍歷:c b a
第三種:
- 先序遍歷:a b c
- 中序遍歷:b c a
- 後序遍歷:c b a
第四種
- 先序遍歷:a b c
- 中序遍歷:a c b
- 後序遍歷:c b a
第五種
- 先序遍歷:a b c
- 中序遍歷:a b c
- 後序遍歷:c b a
本人水平有限,如有錯誤請指出,謝謝!