1. 程式人生 > >二叉連結串列的儲存結構和基本操作(各種遍歷、求樹深度、求樹葉個數)

二叉連結串列的儲存結構和基本操作(各種遍歷、求樹深度、求樹葉個數)

1.二叉樹的定義及性質

二叉樹是一種樹狀結構,它的特點是每個節點至多隻能有兩棵子樹,並且二叉樹的子樹有左右之分,其次序不能任意調換。

二叉樹具有以下重要性質:

性質 1 在二叉樹的第i層上至多有2^(i-1)個節點。

性質 2 深度為k的二叉樹至多有2^k-1個節點。

性質 3 對於任何一棵二叉樹T,如果其終端節點數為n0,度為2的節點數n2,則n0=n2+1。

2.二叉樹的儲存結構

 二叉樹的鏈式儲存結構是指,用連結串列來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。通常的方法是連結串列中每個結點由三個域組成,

資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存地址。其結點結構為:


  其中,data域存放某結點的資料資訊;lchild與rchild分別存放指向左孩子和右孩子的指標,當左孩子或右孩子不存在時,相應指標域值為空

用符號∧或NULL表示)。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為二叉連結串列,如圖下所示。  


二叉樹的鏈式儲存結構是一種非常重要的資料結構,其定義形式如下:

//二叉樹的鏈式儲存結構
typedef struct Bitnode{
    char data;
    struct Bitnode *lchild;
    struct Bitnode *rchild;
}Bitnode,*Bitree;
3.二叉樹的遍歷

遍歷:即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序遍歷,中序遍歷,後序遍歷。

前序遍歷:根節點->左子樹->右子樹

中序遍歷:左子樹->根節點->右子樹

後序遍歷:左子樹->右子樹->根節點

            

先序遍歷:abdefgc

中序遍歷:debgfac

後序遍歷:edgfbca

4.遍歷的實現

//先序遍歷
void preOrder(Bitree T)
{
    if(T==NULL) return ;
    else
    {
        printf("%c",T->data);
        preOrder(T->lchild);
        preOrder(T->rchild);
    }
}
//中序遍歷
void InOrder(Bitree T)
{
    if(T==NULL) return;
    else{
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
}
//後續遍歷
void PostOrder(Bitree T){
    if(T==NULL) return ;
    else{
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
    }
}
//層次遍歷
void levelOrder(Bitree T)
{
    Bitree p=T;
    queue<Bitree> Q;
    Q.push(p);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        printf("%c",p->data);
        if(p->lchild!=NULL)
            Q.push(p->lchild);
        if(p->rchild!=NULL)
            Q.push(p->rchild);
    }
}
5.求樹的深度
//求樹的深度
int TreeDeep(Bitree T)
{
    int deep=0;
    if(T)
    {
        int leftdeep=TreeDeep(T->lchild);
        int rightdeep=TreeDeep(T->rchild);
        deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
    }
    return deep;
}

6.求樹葉的個數
//求樹葉的個數
int Leafcount(Bitree T,int &num)
{
        if(T)
        {
            if(T->lchild==NULL && T->rchild==NULL)
                num++;
            Leafcount(T->lchild,num);
            Leafcount(T->rchild,num);
        }
    return num;
}
 /*-----------------------完整程式碼-----------------------*/
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
//二叉樹的鏈式儲存結構
typedef struct Bitnode{
    char data;
    struct Bitnode *lchild;
    struct Bitnode *rchild;
}Bitnode,*Bitree;

//按先序序列建立二叉樹
void creatBitree(Bitree &T)
{
    char ch;
    scanf("%c",&ch);
    getchar();
    if(ch ==' ')
        T = NULL;
    else
    {
        T=(Bitree)malloc(sizeof(Bitnode));
        T->data=ch;
        printf("輸入%c的左子樹:",ch);
        creatBitree(T->lchild);
        printf("輸入%c的右子樹:",ch);
        creatBitree(T->rchild);
    }
}
//先序遍歷
void preOrder(Bitree T)
{
    if(T==NULL) return ;
    else
    {
        printf("%c",T->data);
        preOrder(T->lchild);
        preOrder(T->rchild);
    }
}
//中序遍歷
void InOrder(Bitree T)
{
    if(T==NULL) return;
    else{
        InOrder(T->lchild);
        printf("%c",T->data);
        InOrder(T->rchild);
    }
}
//後續遍歷
void PostOrder(Bitree T){
    if(T==NULL) return ;
    else{
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%c",T->data);
    }
}
//層次遍歷
void levelOrder(Bitree T)
{
    Bitree p=T;
    queue<Bitree> Q;
    Q.push(p);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        printf("%c",p->data);
        if(p->lchild!=NULL)
            Q.push(p->lchild);
        if(p->rchild!=NULL)
            Q.push(p->rchild);
    }
}
//求樹的深度
int TreeDeep(Bitree T)
{
    int deep=0;
    if(T)
    {
        int leftdeep=TreeDeep(T->lchild);
        int rightdeep=TreeDeep(T->rchild);
        deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
    }
    return deep;
}
//求樹葉的個數
int Leafcount(Bitree T,int &num)
{
        if(T)
        {
            if(T->lchild==NULL && T->rchild==NULL)
                num++;
            Leafcount(T->lchild,num);
            Leafcount(T->rchild,num);
        }
    return num;
}

int main()
{
    Bitree T;
    int num=0;
    printf("輸入樹根:");
    creatBitree(T);
    printf("先序遍歷:\n");
    preOrder(T);
    printf("\n");
    printf("中序遍歷:\n");
    InOrder(T);
    printf("\n");
    printf("後序遍歷:\n");
    PostOrder(T);
    printf("\n");
    printf("層次遍歷:\n");
    levelOrder(T);
    printf("\n");
    printf("求樹的深度:\n");
    printf("%d\n",TreeDeep(T));
    printf("求樹葉的個數:\n");
    printf("%d\n",Leafcount(T, num));
    return 0;
}

演算法截圖



相關推薦

連結串列儲存結構基本操作各種深度樹葉個數

1.二叉樹的定義及性質 二叉樹是一種樹狀結構,它的特點是每個節點至多隻能有兩棵子樹,並且二叉樹的子樹有左右之分,其次序不能任意調換。 二叉樹具有以下重要性質: 性質 1 在二叉樹的第i層上至多有2^(i-1)個節點。 性質 2 深度為k的二叉樹至多有2^k-1個節點。 性

NOJ-建立連結串列儲存結構-西工大資料結構

    今天上課講完二叉樹的第一節之後,回到宿舍就把二叉樹的第一道題做了。如有錯誤,請務必指正。    題目如下:    分析一下題目,就是用遞迴建立一個二叉樹,在按照先序遍歷輸出。這裡我採用的方法是每次讀入兩個資料,當第一個資料是字母,若第二個資料是‘(’,說明這個根有左支

連結串列儲存結構構建以及先序

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTyp

連結串列儲存進行先序中序後序的演算法

用二叉樹連結串列作為儲存結構,完成二叉樹的建立,先序、中序和後序以及按層次遍歷的操作,求所有葉子及結點總數的操作 #include<iostream>   #include<cstdio>   #include<stdlib.h&

c語言實現基本操作--連結串列儲存

利用二叉連結串列儲存,並且利用遞迴的方法實現二叉樹的遍歷(前序遍歷、中序遍歷和後續遍歷)操作。 c語言具體實現程式碼如下: #include<stdio.h> #include<stdlib.h> #include<malloc.h>

1建立二叉樹二叉連結串列2寫出對用二叉連結串列儲存二叉樹進行先序中序後序遍歷的遞迴非遞迴演算法。 3寫出對用二叉連結串列儲存二叉樹進行層次遍歷演算法。 4)求二叉樹的所有葉子及結點總數。

(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu

連結串列儲存

節點形態: 實現: /****************************************** 二叉樹的二叉連結串列儲存 by Rowandjj 2014/5/18 ****************************************

採用連結串列儲存,複製的演算法的應用

二叉樹採用二叉連結串列儲存,試寫出複製一棵二叉樹的演算法。 話不多說上程式碼: #include<stdio.h> #include<stdlib.h> typedef struct BiTnode   {   &

資料結構筆記靜態連結串列的實現基本操作

一、靜態連結串列的定義 用資料替代指標,來描述單鏈表。首先,資料的元素由兩個資料域組成,data和cur。資料域data,用來存放資料元素,即要處理的資料;遊標cur相當於單鏈表中的next指標。 //線性表的靜態單鏈表儲存結構 #define MAXSIZ

-連結串列儲存結構及其簡單演算法

適用於層次結構的資料(大部分演算法用遞迴思想) #include <stdio.h> #define Max 100 結構體 typedef struct TNode{ int data; struct Node * lchild;//左孩子結點

儲存結構連結串列(孩子—兄弟)

// c6-5.h 樹的二叉連結串列(孩子—兄弟)儲存結構(見圖6.32) typedef struct CSNode { TElemType data; CSNode *firstchild,*nextsibling; }CSNode,*CSTree; 一棵樹無論有

資料結構 筆記-5 線索 以及 線索連結串列

線索二叉連結串列 線索二叉連結串列 來自於 二叉連結串列。一個二叉連結串列,如果存放n個結點,就一定有n+1個空指標域,而線上索鏈 表中,就讓這n+1個空指標域有了用武之地。 空指標域 用於存放 某種遍歷順序下的 前驅或者後繼的地址。   已知 一棵二叉樹的結構:

資料結構專題——儲存結構基本操作

一般來說,二叉樹使用連結串列來定義。 與普通連結串列的差別在於,二叉樹每個節點有兩條出邊,因此指標域變成了兩個,分別指向左子樹根節點地址和右子樹的根節點地址,如果某個子樹不存在,則指向NULL,其他地方與普通連結串列完全相同,這樣的連結串列又被叫作二叉連結串列。 二叉樹資

[資料結構]連結串列的類模板實現

該類模板實現了一個二叉樹的模板類,採用二叉連結串列實現。定義二叉樹節點類,採用二叉連結串列實現。///////////////////////// #include <iostream> #include <cstdlib> #include <

C#實現--連結串列結構

1 /// <summary> 2 /// 二叉搜尋樹:結點的左子節點的值永遠小於該結點的值,而右子結點的值永遠大於該結點的值 稱為二叉搜尋樹 3 /// </summary> 4 public class LinkBinarySear

資料結構C語言——用連結串列

標頭檔案,定義棧和結構體的功能: /* 二叉樹的連結表示*/ #include <stdio.h> #include <stdlib.h> typedef char DataType; struct BinTreeNode; typedef

擴充套件的先序序列建立以連結串列方式儲存,後序

1. 請根據使用者輸入的“擴充套件的先序遍歷序列”(用小圓點表示空子樹),建立以二叉連結串列方式儲存的二叉樹,然後寫出後序遍歷該二叉樹的非遞迴演算法,並將對應的程式除錯執行通過。 #include<stdio.h> #include<std

玩轉連結串列 20 分

玩轉二叉連結串列 (20 分) 先序建立二叉樹的二叉連結串列 設計程式,按先序建立二叉樹的二叉連結串列;然後先序、中序、後序遍歷二叉樹。 輸入格式: 按先序輸入一棵二叉樹。二叉樹中每個結點的鍵值用字元表示,字元之間不含空格。注意空樹資訊也要提供,以#字元表示空樹。 輸出格式:

連結串列

#include<iostream>   #include<string>   using namespace std;      struct Node &nb

java由先根中根序列建立,由標明空子建立,有完全順序儲存結構建立鏈式儲存結構

    //由先根和中根遍歷建立二叉樹 public class bitree{     public bitree(String preorder,String inorder,int preindex,int in