一步一步寫數據結構(二叉樹的建立和遍歷,c++)


簡述:

二叉樹是十分重要的數據結構,主要用來存放數據,並且方便查找等操作,在很多地方有廣泛的應用。

二叉樹有很多種類,比如線索二叉樹,二叉排序樹,平衡二叉樹等,本文寫的是最基礎最簡單的二叉樹。

思路:

二叉樹的建立采用的是遞歸的思想:給定一個指向根節點的指針,然后遞歸調用ceate()函數,自動生成一個二叉樹。就像是在地上挖了個坑(根節點),然后他會拿着鏟子(create函數)按照一定的規則自動挖一個很大的洞穴(二叉樹)出來。當然挖坑前需要先定義每個洞長什么樣(定義節點結構)。

二叉樹的遍歷采用的也是遞歸的思想:如果節點有數據,則按照遍歷規則打印根節點和孩子節點,沒有數據則返回直到所有數據都遍歷完,遞歸結束。

不廢話,上代碼:

#include<iostream>
using namespace std;

//定義節點
typedef struct node
{
    struct node *lchild;
    struct node *rchild;
    char data;
}BiTreeNode, *BiTree;     //*BiTree的意思是給 struct node*起了個別名,叫BiTree,故BiTree為指向節點的指針。


//按照前序順序建立二叉樹
void createBiTree(BiTree &T) //&的意思是傳進來節點指針的引用,括號內等價於 BiTreeNode* &T,目的是讓傳遞進來的指針發生改變
{                        
    char c;
    cin >> c;
    if('#' == c)             //當遇到#時,令樹的根節點為NULL,從而結束該分支的遞歸
        T = NULL;
    else
    {
        T = new BiTreeNode;
        T->data=c;
        createBiTree(T->lchild);
        createBiTree(T->rchild);
    }
}

//前序遍歷二叉樹並打印
void preTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data<<" ";
        preTraverse(T->lchild);
        preTraverse(T->rchild);
    }
}
//中序遍歷二叉樹並打印
void midTraverse(BiTree T)
{
    if(T)
    {
        midTraverse(T->lchild);
        cout<<T->data<<" ";
        midTraverse(T->rchild);
    }
}
//后續遍歷二叉樹並打印
void postTraverse(BiTree T)
{
    if(T)
    {
        postTraverse(T->lchild);
        postTraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
int main()
{
    BiTree T;               //聲明一個指向二叉樹根節點的指針               
    createBiTree(T);
    cout<<"二叉樹創建完成!"<<endl;
    cout<<"前序遍歷二叉樹:"<<endl;
    preTraverse(T);
    cout<<endl;
    cout<<"中序遍歷二叉樹:"<<endl;
    midTraverse(T);
    cout<<endl;
    cout<<"后序遍歷二叉樹:"<<endl;
    postTraverse(T);
    return 0;
}

測試結果:

假設我們要建立一個如下圖所示的二叉樹,#代表空節點,按照前序遍歷順序二叉樹表示為:ab##c##

 .                                                                  

下面是代碼的運行結果,正如預期:

                                           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM