1. 程式人生 > >資料結構作業——————二叉樹的三種遍歷方式

資料結構作業——————二叉樹的三種遍歷方式

資料結構作業:

  • 二叉樹的建立
  • 三種遍歷方式

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

本人水平有限,如有錯誤請指出,謝謝!