資料結構作業:
二叉樹的建立
三種周遊方式
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