91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

純C++二叉樹相關操作實例代碼分析

發布時間:2022-07-12 10:25:02 來源:億速云 閱讀:183 作者:iii 欄目:開發技術

這篇“純C++二叉樹相關操作實例代碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“純C++二叉樹相關操作實例代碼分析”文章吧。

二叉樹的概念

二叉樹(Binary tree)是樹形結構的一個重要類型。許多實際問題抽象出來的數據結構往往是二叉樹形式,即使是一般的樹也能簡單地轉換為二叉樹,而且二叉樹的存儲結構及其算法都較為簡單,因此二叉樹顯得特別重要。二叉樹特點是每個節點最多只能有兩棵子樹,且有左右之分 。

二叉樹的相關術語

①節點:包含一個數據元素及若干指向子樹分支的信息 。

②節點的度:一個節點擁有子樹的數目稱為節點的度 。

③葉子節點:也稱為終端節點,沒有子樹的節點或者度為零的節點 。

④分支節點:也稱為非終端節點,度不為零的節點稱為非終端節點 。

⑤樹的度:樹中所有節點的度的最大值 。

⑥節點的層次:從根節點開始,假設根節點為第1層,根節點的子節點為第2層,依此類推,如果某一個節點位于第L層,則其子節點位于第L+1層 。

⑦樹的深度:也稱為樹的高度,樹中所有節點的層次最大值稱為樹的深度  。

相關操作菜單

//菜單
void menu()
{
    cout << "\t\t\t******************************************************************" << endl;
    cout << "\t\t\t****************  1.輸入-1  退出程序           *******************" << endl;
    cout << "\t\t\t****************  2.輸入1   初始化二叉樹       *******************" << endl;
    cout << "\t\t\t****************  3.輸入2   對二叉樹先序遍歷   *******************" << endl;
    cout << "\t\t\t****************  4.輸入3   對二叉樹中序遍歷   *******************" << endl;
    cout << "\t\t\t****************  5.輸入4   對二叉樹后序遍歷   *******************" << endl;
    cout << "\t\t\t****************  6.輸入5   對二叉樹層次遍歷   *******************" << endl;
    cout << "\t\t\t****************  7.輸入6   二叉樹深度         *******************" << endl;
    cout << "\t\t\t****************  8.輸入7   二叉樹葉子結點數   *******************" << endl;
    cout << "\t\t\t****************  9.輸入8   二叉樹的結點數     *******************" << endl;
    cout << "\t\t\t******************************************************************" << endl;
}

二叉樹的構造

//構造二叉樹
typedef struct Binode
{
    //數據域
    char data;
    //定義左孩子和右孩子
    struct Binode*lchid, *rchid;
}Binode, *StrBinode;

創建二叉樹

//先序遍歷創建二叉樹
void creatBinode(StrBinode&T)
{
    cin >> ch;
    if (ch == '#')
    {
        //如果輸入是#的話就說明根結點就是葉子結點
        //就沒必要再去進行開辟一個二叉樹空間
        T = NULL;
    }
    else
    {
        T = new Binode;
        T->data = ch;
        creatBinode(T->lchid);
        creatBinode(T->rchid);
    }
}

先序遍歷二叉樹  

//先序遍歷二叉樹
void visitBinode(StrBinode&T)
{
    if (T!=NULL)
    {
        cout << T->data << " ";
        visitBinode(T->lchid);
        visitBinode(T->rchid);
    }
    if(T==NULL)
    {
        cout << "#" << " ";
    }
}

中序遍歷二叉樹

//中序遍歷二叉樹
void MidvisitBinode(StrBinode&T)
{
    if (T != NULL)
    {
        visitBinode(T->lchid);
        cout << T->data << " ";
        visitBinode(T->rchid);
    }
    if (T == NULL)
    {
        cout << "#" << " ";
    }
}

后序遍歷二叉樹

//后序遍歷二叉樹
void BackvisitBinode(StrBinode&T)
{
    if (T != NULL)
    {
        visitBinode(T->lchid);
        visitBinode(T->rchid);
        cout << T->data << " ";
    }
    if (T == NULL)
    {
        cout << "#" << " ";
    }
}

層次遍歷二叉樹

//二叉樹的層次遍歷
void Levelorder(StrBinode&HT)
{
    StrBinode T;
    T = new Binode;
    //創建一個隊列qu
    queue<StrBinode> qu;
    //將根結點的指針壓入隊列
    qu.push(HT);
    //當隊列不為空的時候就繼續進行循環
    while (!qu.empty())
    {
        //讓T里面存放隊列中第一個元素的值
        T = qu.front();
        //C++自帶的隊列出隊的話是刪除值不返回值
        qu.pop();
        //訪問出隊元素的值
        cout << T->data << " ";
        //當該節點左孩子不為空的時候就讓左孩子入隊
        if (T->lchid != NULL)
        {
            qu.push(T->lchid);
        }
        //當該節點右孩子不為空的時候就讓左孩子入隊
        if (T->rchid != NULL)
        {
            qu.push(T->rchid);
        }
    }
    
}

二叉樹的深度

//二叉樹的深度
int deep(StrBinode&T)
{
    if (T == NULL)
    {
        return 0;
    }
    else
    {
        int m = deep(T->lchid);
        int n = deep(T->rchid);
        if (m > n)
        {
            return (m + 1);
        }
        else
        {
            return (n + 1);
        }
    }
}

二叉樹的葉子結點數

//求二叉樹的葉子結點
int leaf(StrBinode&T)
{
    //如果是空樹
    if (T == NULL)
    {
        //返回0
        return 0;
    }
    //如果是葉子結點
    if (T->lchid == NULL && T->rchid == NULL)
    {
        //返回1
        return 1;
    }
    return leaf(T->lchid) + leaf(T->rchid);
}

二叉樹的結點數

//求二叉樹的結點數
int Nodecount(StrBinode&T)
{
    //如果是根結點沒有數據
    if (T == NULL)
    {
        return 0;
    }
    else
    {
        return Nodecount(T->lchid) + Nodecount(T->rchid) + 1;
    }
}

整體代碼

#include<iostream>
#include<queue>
using namespace std;
char ch = 0;
 
//構造二叉樹
typedef struct Binode
{
    //數據域
    char data;
    //定義左孩子和右孩子
    struct Binode*lchid, *rchid;
}Binode, *StrBinode;
 
//先序遍歷創建二叉樹
void creatBinode(StrBinode&T)
{
    cin >> ch;
    if (ch == '#')
    {
        //如果輸入是#的話就說明根結點就是葉子結點
        //就沒必要再去進行開辟一個二叉樹空間
        T = NULL;
    }
    else
    {
        T = new Binode;
        T->data = ch;
        creatBinode(T->lchid);
        creatBinode(T->rchid);
    }
}
 
//先序遍歷二叉樹
void visitBinode(StrBinode&T)
{
    if (T!=NULL)
    {
        cout << T->data << " ";
        visitBinode(T->lchid);
        visitBinode(T->rchid);
    }
    if(T==NULL)
    {
        cout << "#" << " ";
    }
}
 
//中序遍歷二叉樹
void MidvisitBinode(StrBinode&T)
{
    if (T != NULL)
    {
        visitBinode(T->lchid);
        cout << T->data << " ";
        visitBinode(T->rchid);
    }
    if (T == NULL)
    {
        cout << "#" << " ";
    }
}
 
//后序遍歷二叉樹
void BackvisitBinode(StrBinode&T)
{
    if (T != NULL)
    {
        visitBinode(T->lchid);
        visitBinode(T->rchid);
        cout << T->data << " ";
    }
    if (T == NULL)
    {
        cout << "#" << " ";
    }
}
 
//二叉樹的層次遍歷
void Levelorder(StrBinode&HT)
{
    StrBinode T;
    T = new Binode;
    //創建一個隊列qu
    queue<StrBinode> qu;
    //將根結點的指針壓入隊列
    qu.push(HT);
    //當隊列不為空的時候就繼續進行循環
    while (!qu.empty())
    {
        //讓T里面存放隊列中第一個元素的值
        T = qu.front();
        //C++自帶的隊列出隊的話是刪除值不返回值
        qu.pop();
        //訪問出隊元素的值
        cout << T->data << " ";
        //當該節點左孩子不為空的時候就讓左孩子入隊
        if (T->lchid != NULL)
        {
            qu.push(T->lchid);
        }
        //當該節點右孩子不為空的時候就讓左孩子入隊
        if (T->rchid != NULL)
        {
            qu.push(T->rchid);
        }
    }
    
}
 
//二叉樹的深度
int deep(StrBinode&T)
{
    if (T == NULL)
    {
        return 0;
    }
    else
    {
        int m = deep(T->lchid);
        int n = deep(T->rchid);
        if (m > n)
        {
            return (m + 1);
        }
        else
        {
            return (n + 1);
        }
    }
}
 
//求二叉樹的葉子結點
int leaf(StrBinode&T)
{
    //如果是空樹
    if (T == NULL)
    {
        //返回0
        return 0;
    }
    //如果是葉子結點
    if (T->lchid == NULL && T->rchid == NULL)
    {
        //返回1
        return 1;
    }
    return leaf(T->lchid) + leaf(T->rchid);
}
 
//求二叉樹的結點數
int Nodecount(StrBinode&T)
{
    //如果是根結點沒有數據
    if (T == NULL)
    {
        return 0;
    }
    else
    {
        return Nodecount(T->lchid) + Nodecount(T->rchid) + 1;
    }
}
 
//菜單
void menu()
{
    cout << "\t\t\t******************************************************************" << endl;
    cout << "\t\t\t****************  1.輸入-1  退出程序           *******************" << endl;
    cout << "\t\t\t****************  2.輸入1   初始化二叉樹       *******************" << endl;
    cout << "\t\t\t****************  3.輸入2   對二叉樹先序遍歷   *******************" << endl;
    cout << "\t\t\t****************  4.輸入3   對二叉樹中序遍歷   *******************" << endl;
    cout << "\t\t\t****************  5.輸入4   對二叉樹后序遍歷   *******************" << endl;
    cout << "\t\t\t****************  6.輸入5   對二叉樹層次遍歷   *******************" << endl;
    cout << "\t\t\t****************  7.輸入6   二叉樹深度         *******************" << endl;
    cout << "\t\t\t****************  8.輸入7   二叉樹葉子結點數   *******************" << endl;
    cout << "\t\t\t****************  9.輸入8   二叉樹的結點數     *******************" << endl;
    cout << "\t\t\t******************************************************************" << endl;
}
 
int main()
{
    int n = 0;
    StrBinode T;
    menu();
    while (cin >> n)
    {
        if (n < 0)
        {
            break;
        }
        switch (n)
        {
        case 1:
            //初始化二叉樹
            cout << "請輸入值對二叉樹進行初始化" << endl;
            creatBinode(T);
            cout << "初始化完成" << endl;
            break;
        case 2:
            //先序遍歷
            cout << "先序遍歷的結果為" << endl;
            visitBinode(T);
            cout << "先序遍歷結束" << endl;
            break;
        case 3:
            //中序遍歷
            cout << "中序遍歷的結果為" << endl;
            MidvisitBinode(T);
            cout << "中序遍歷結束" << endl;
            break;
        case 4:
            //后序遍歷
            cout << "后序遍歷的結果為" << endl;
            BackvisitBinode(T);
            cout << "后序遍歷結束" << endl;
            break;
        case 5:
            //層次遍歷
            cout << "層次遍歷的結果為" << endl;
            Levelorder(T);
            cout << "層次遍歷結束" << endl;
            break;
        case 6:
            cout << "二叉樹的深度為:";
            cout << deep(T) << endl;
            break;
        case 7:
            cout << "二叉樹的葉子結點數為:";
            cout << leaf(T) << endl;
            break;
        case 8:
            cout << "二叉樹的結點數為;";
            cout << Nodecount(T) << endl;
            break;
        default:
            cout << "您的輸入有誤,請重新輸入" << endl;
            break;
        }
    }
    return 0;
}

結果展示

純C++二叉樹相關操作實例代碼分析

純C++二叉樹相關操作實例代碼分析

以上就是關于“純C++二叉樹相關操作實例代碼分析”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

孙吴县| 巴东县| 尉犁县| 张家界市| 青铜峡市| 涿州市| 仙居县| 庐江县| 崇州市| 延长县| 青神县| 大理市| 奉贤区| 贡觉县| 鄂托克旗| 乐业县| 正宁县| 广饶县| 洪雅县| 大埔区| 二连浩特市| 莫力| 唐海县| 迁西县| 盘锦市| 阜宁县| 霍山县| 武宁县| 连州市| 龙门县| 资中县| 永顺县| 金华市| 黑河市| 托里县| 嘉峪关市| 南投县| 宜宾县| 阜宁县| 敦煌市| 即墨市|