1. 程式人生 > >資料結構實驗三 二叉樹的層次遍歷

資料結構實驗三 二叉樹的層次遍歷

實驗五   二叉樹

一、實驗目的

    掌握二叉樹的建立、遍歷的方法。

二、實驗內容

    利用二叉樹的擴充套件前序遍歷序列建立二叉樹,然後實現二叉樹的前序、中序和後序遍歷。

三、實驗內容準備

在二叉樹做任何運算之前,二叉樹本身必須存在。因此,首先必須建立二叉樹,實際上就是建立二叉樹的儲存結構。建立二叉樹的儲存結構就是建立二叉連結串列。例二叉樹的擴充套件前序序列為"ABC##D#E##F##",則由此建立的二叉樹的中序序列為:CBDEAF,後序序列為:CEDBFA

原始碼:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
using namespace std;
#define N 100
char *a="ABC##D#E##F##";  /*擴充二叉樹樹t的前序序列*/
typedef struct node /*二叉樹結構定義*/
{
    char data;
    struct node *lchild,*rchild;
} binnode;
typedef binnode *bintree;


/*函式creatbintree (根據擴充二叉樹的前序序列(字串a)建立二叉樹t的儲存結構*/
bintree  creatbintree()
{
    char ch=*a++;
    bintree t;
    if  (ch=='#')  t=NULL;
    else
    {
        t=(bintree)malloc(sizeof(binnode));
        t->data=ch;
        t->lchild=creatbintree();
        t->rchild=creatbintree();
    }
    return t;
}


void preorder(bintree t)  /*前序遞迴遍歷二叉樹*/
{
    if (t)
    {
        printf("%c",t->data);
        preorder(t->lchild);
        preorder(t->rchild);
    }
}
void inorder(bintree t)  /*中序遞迴遍歷二叉樹*/
{
    if (t)
    {


        inorder(t->lchild);
        printf("%c",t->data);
        inorder(t->rchild);
    }
}
void postorder(bintree t)  /*後序遞迴遍歷二叉樹*/
{
    if (t)
    {


        postorder(t->lchild);
        postorder(t->rchild);
        printf("%c",t->data);
    }
}


/*************************************二叉樹的層次遍歷***********************************/
queue<binnode*>q;
void ccc(bintree t)
{
    if(t!=NULL)
    {
        q.push(t);
        while(!q.empty())
        {
            cout<<q.front()->data;
            if(q.front()->lchild!=NULL)
                q.push(q.front()->lchild);
            if(q.front()->rchild!=NULL)
                q.push(q.front()->rchild);
                q.pop();
        }
    }
}
/*****************************************************************************************/
int main()
{
    bintree t;
    t=creatbintree();   /*建立二叉樹t的儲存結構*/
    printf("二叉樹的前序序列為:\n");
    preorder(t);   /*前序非遞迴遍歷二叉樹*/
    printf("二叉樹的中序序列為:\n");
    inorder(t);   /*中序非遞迴遍歷二叉樹*/
    printf("二叉樹的層次遍歷序列為:\n");
    ccc(t);   /*中序非遞迴遍歷二叉樹*/
    return 0;
}

四、實驗要求:

1、  理解並除錯好本程式;

2、  增加二叉樹的按層遍歷演算法並重新除錯。

3、  寫出實驗報告。

二叉樹的層次遍歷(STL實現)

/*************************************二叉樹的層次遍歷***********************************/
queue<binnode*>q;
void ccc(bintree t)
{
    if(t!=NULL)
    {
        q.push(t);
        while(!q.empty())
        {
            cout<<q.front()->data;
            if(q.front()->lchild!=NULL)
                q.push(q.front()->lchild);
            if(q.front()->rchild!=NULL)
                q.push(q.front()->rchild);
                q.pop();
        }
    }
}
/*****************************************************************************************/


相關推薦

資料結構實驗

【實驗內容】 建立一個二叉樹,對這棵動態二叉樹進行分析,將其用靜態二叉連結串列表示。二叉樹的動態二叉連結串列結構中的每個結點有三個欄位:data,lchild,rchild。靜態二叉連結串列是用陣列作為儲存空間,每個陣列元素儲存二叉樹的一個結點,也有三個欄位:

資料結構實驗 層次

實驗五   二叉樹 一、實驗目的     掌握二叉樹的建立、遍歷的方法。 二、實驗內容     利用二叉樹的擴充套件前序遍歷序列建立二叉樹,然後實現二叉樹的前序、中序和後序遍歷。 三、實驗內容準備 在二叉樹做任何運算之前,二叉樹本身必須存在。因此,首先必須建立二叉樹,實際上

資料結構——3.3 的同構

一、二叉樹的遍歷 1、先序遍歷 遍歷過程為: 1)訪問根結點 2)先序遍歷其左子樹 3)先序遍歷其右子樹 這樣的一種遍歷過程,其實也是一種遞迴的思想。 A(BDFE)(CGHI),先序遍歷=> ABDFECGHI 2、中序遍歷 遍歷過程為: 1)中序遍歷其左子樹

《大話資料結構8》—— “

   二叉樹的遍歷 ●  是指從根節點出發, 按照某種次序依次訪問二叉樹中所有結點, 使得每個結點被訪問一次且僅被訪問一次。 ●  二叉樹的遍歷方式很多,如果我們限制了從左到右的習慣方式,那麼主要就分為四種: (1 )前序

資料結構實驗:統計葉子數 SDUT 3342

#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*r; }; struct node *root; char st[51]; int i; in

】SDUT 3342 資料結構實驗:統計葉子數

Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,,de,g,,f,,, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Output 輸出

資料結構實驗:統計葉子數

Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每

資料結構實驗:統計葉子數(有返回值版)

Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並求二叉樹的葉子結點個數。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Output 輸出

資料結構實驗:統計葉子數 SDUT 3342

#include <stdio.h> #include <string.h> struct node { char data; struct node *l,*

SDUT OJ 資料結構實驗:統計葉子數

資料結構實驗之二叉樹三:統計葉子數Time Limit: 1000 ms Memory Limit: 65536 KiBProblem Description已知二叉樹的一個按先序遍歷輸入的字元序列,如

資料結構實驗六:哈夫曼編碼(SDUT 3345)

題解:離散中的“最小生成樹(最優樹)”。 #include <bits/stdc++.h> using namespace std; void qusort(int l, int r, int a[]) { int x = a[l]; int i = l, j =

資料結構實驗一:的同構 (SDUT 3340)

題解:把原本結構體的左右子樹的型別定義成 int 型,用來存放這個結點的左右子樹的編號,分別建造兩棵二叉樹,按個比較,如果在第二棵樹中沒有找到,那麼就不用在判斷了。 #include <bits/stdc++.h> using namespace std; struct node

資料結構實驗八:(中序後序)求的深度(SDUT 2804)

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char data ; struct node *l,*r; }; struct node *cr

資料結構實驗七:葉子問題(SDUT 3346)

#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100]; int num = 0; struct node

資料結構實驗四:(先序中序)還原 (SDUT 3343)

#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char a[100],b[100]; int n; struct node

資料結構實驗五:層序 (SDUT 3344)

#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; }; char s[505]; int num; struct node *cre

資料結構實驗 SDUT 3341

#include <bits/stdc++.h> using namespace std; struct Tree { char data; struct Tree *right; struct Tree *left; }; char str[55]; in

SDUTOJ3344資料結構實驗五:層序

資料結構實驗之二叉樹五:層序遍歷 https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2711/pid/3344 Time Limit: 1000 ms Memo

3340--資料結構實驗一:的同構

現給定兩棵樹,請你判斷它們是否是同構的。 Input 輸入資料包含多組,每組資料給出2棵二叉樹的資訊。對於每棵樹,首先在一行中給出一個非負整數N (≤10),即該樹的結點數(此時假設結點從0到N−1編號);隨後N行,第i行對應編號第i個結點,給出該結點中儲存的1

資料結構實驗

Problem Description 已知二叉樹的一個按先序遍歷輸入的字元序列,如abc,de,g,f, (其中,表示空結點)。請建立二叉樹並按中序和後序的方式遍歷該二叉樹。 Input 連續輸入多組資料,每組資料輸入一個長度小於50個字元的字串。 Outpu