天天看點

資料結構作業——————二叉樹的三種周遊方式

資料結構作業:

二叉樹的建立

三種周遊方式

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

繼續閱讀