1. 程式人生 > >二叉樹的鏈式儲存及其部分函式實現

二叉樹的鏈式儲存及其部分函式實現

題意

實現二叉樹的鏈式儲存和部分的函式

思路

這是一個鏈式儲存實現的二叉樹。首先 是構造了一個名為 node 的 二叉樹資料結構內有(1)char 變數,(2)兩個指向其本身的結構體指標變數 lch,rch.然後 用typedef分別給 node結構體起了一個Bn的別名和給 node* 起了一個Bt 的別名方便後面程式碼的使用。Bn和Bt分別是代表二叉樹節點           型別和二叉樹節點指標。在主函式裡先定義了一個結構體指標(node *) 型別的變數 head,這個結構體指標變數 head是我們要構造的二叉樹的根結點;(變數的本質是在記憶體中開闢一塊空間,這塊空間在記憶體中有相應的地址,而空間裡存放我們要存放的資料。)在 cbtree函式裡頭 形參 是( Bt &T) 意思是定義了一個結構體指標變數 T ,而 T前面的 & 起到了一個引用傳遞(意思是呼叫函式cbtree時引用了head變數)的作用。cbtree函式內部是一個先序構造二叉樹的操作,前面已說明是在head上進行操作則在呼叫cbtree函式的開始就是對 head 結點的操作 。輸入date 資料 c如果c是' , ' 則變數T(這步操作是變數head為空,接下來的遞迴操作就是具體的樹的左右分支結點為空)就為空,否則進行 T=new Bn(T=new Bn,申請一塊該型別空間,並把地址返回,藉此完成了結構體指標變數的初始化)並把 c 的值賦給T->date(這步操作是把 c 的值賦給結構體指標變數head的,接下來的遞迴操作就是給具體的樹的左右分支結點賦值),接下來就是遞迴操作實現左右子樹的構建。

code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
typedef struct node
{
    char date;
    node *lch,*rch;// 在結構體中定義指標型的左子樹和右子樹
}Bn,*Bt;           // Bn 代表結點 *Bt代表根節點

void cbtree(Bt &T) // 先序建二叉樹
{
    char c;
    scanf("%c",&c);

    if(c==',')
        T=NULL;
    else
    {
        T=new Bn;
        T->date=c;
        cbtree(T->lch);
        cbtree(T->rch);
    }
    return ;
}

void pre(Bt T)    //先序遍歷二叉樹
{
    if(T)
    {
        printf("%c",T->date);
        pre(T->lch);
        pre(T->rch);
    }
}

void in(Bt T)     //中序遍歷二叉樹
{
    if(T)
    {
        in(T->lch);
        printf("%c",T->date);
        in(T->rch);
    }
}

void post(Bt T)   //後序遍歷二叉樹
{
    if(T)
    {
        post(T->lch);
        post(T->rch);
        printf("%c",T->date);
    }
}

void level(Bt T)  //層次遍歷二叉樹
{
    queue<Bn> Q;
    Q.push(*T);
    while(!Q.empty())
    {
        Bn next=Q.front();
        Q.pop();
        printf("%c",next.date);
        if(next.lch) Q.push(*(next.lch));
        if(next.rch) Q.push(*(next.rch));
    }
}

int cnt=0;
void cntleaf1(Bt T) //求葉子節點
{
    if(T)
    {
        if(!T->lch&&!T->rch)
        {
            cnt++;
            return ;
        }
        cntleaf1(T->lch);
        cntleaf1(T->rch);
    }
}

int cntleaf2(Bt T)  //求葉子節點
{
    if(!T) return 0;
    if(!T->lch&&!T->rch) return 1;
    else
    {
        int n1=cntleaf2(T->lch);
        int nr=cntleaf2(T->rch);
        return n1+nr;
    }
}

int dep(Bt T)       //求二叉樹的深度
{
    int ddep=0;
    if(!T) return ddep;
    int n1=dep(T->lch);
    int nr=dep(T->rch);
    return (n1>nr ? n1:nr)+1 ;
}

int main()
{
    Bt head;

    cbtree(head); // 先序遍歷二叉樹
    pre(head);
    printf("\n");

    in(head);     // 中序遍歷二叉樹
    printf("\n");

    post(head);   // 後序遍歷二叉樹
    printf("\n");

    level(head);  // 層次遍歷二叉樹
    printf("\n");

    cntleaf1(head); // 求二叉樹的葉子節點
    printf("%d\n",cnt);
    printf("%d\n",cntleaf2(head)); // 求二叉樹深度
    printf("%d\n",dep(head));
}