二叉樹的存儲結構及其實現


聲明:內容及圖片基於https://www.bilibili.com/video/BV1Gz411b7Rq?from=articleDetail

二叉樹的存儲結構

二叉樹的順序存儲結構

二叉樹的鏈式存儲結構

struct BiNode{ DataType data; BiNode *lchild,*rchild; };

具有n個節點的二叉鏈表中具有n+1個空指針

三叉鏈表

二叉樹的遍歷

前序遍歷

DLR(根,左,右)

 

void BiTree::PreOrder(BiNode *bt){ if(bt==NULL)             //遞歸終止條件 
        return ; else{ visit(bt->data);       //訪問根節點bt數據域 
        PreOrder(bt->lchild);  //前序遞歸遍歷bt左子樹 
        PreOrder(bt->rchild);  //前序遞歸遍歷bt右子樹 
 } }

中序遍歷

void BiTree::InOrder(BiNode *bt){ if(bt==NULL)             //遞歸終止條件 
        return ; else{ InOrder(bt->lchild);  //中序遞歸遍歷bt左子樹
        visit(bt->data);       //訪問根節點bt數據域 
        InOrder(bt->rchild);  //中序遞歸遍歷bt右子樹 
 } }

后序遍歷

void BiTree::PostOrder(BiNode *bt){ if(bt==NULL)             //遞歸終止條件 
        return ; else{ PostOrder(bt->lchild);  //后序遞歸遍歷bt左子樹
        PostOrder(bt->rchild);  //后序遞歸遍歷bt右子樹 
        visit(bt->data);       //訪問根節點bt數據域 
 } } 

層序遍歷

void BiTree::LeverOrder(){ if(root==NULL)          //二叉樹為空,結束 
        return; Queue.enQueue(root); //根指針入隊 
    while(!Queue.isEmpty()){    //隊列非空時 
        q=Queue.deQueue();      //出
        visit(q->data); if(q->lchild!=NULL){          //左孩子非空 
            Queue.enQueue(q->lchild); //左孩子入隊 
 } if(q->rchild!=NULL){          //右孩子非空 
            Queue.enQueue(q->rchild); //右孩子入隊 
 } } } 

二叉樹的創建

建立二叉樹類

class BiTree{ private: BiNode *root; public: BiTree(){ root=Create(root); //構造函數,建立一顆二叉樹 
 } ~BiTree(){ Release(root); //析構函數 
 } void PreOrder(){ PreOrder(root); //前序遍歷 
 } void InOrder(){ InOrder(root); //中序遍歷 
 } void PostOrder(){ PostOrder(root); //后序遍歷 
 } void LeverOrder();   //層序遍歷 
    private: BiNode* Create(BiNode *bt); //構造函數調用
        void Release(BiNode *bt);   //析構函數調用
        void PreOrder(BiNode *bt);  //前序遍歷函數調用
        void InOrder(BiNode *bt);   //中序遍歷函數調用
        void PostOrder(BiNode *bt); //后序遍歷函數調用 
};

構造函數方法一(返回指針)

BiTree::BiTree(){ root=Create(root); } BiNode* BiTree::Create(BiNode *bt){ input(ch); //輸入節點數據 
    if(ch=='#') bt=NULL;          //建立一顆空樹 
    else{ bt=new BiNode; bt->data=ch;               //生成一個節點,數據域為ch 
        bt->lchild=Create(bt->lchild); //前序遍歷方式創建二叉樹 bt->rchild=Create(bt->rchild); } return bt; }

構造函數方法二(引用)

BiTree::BiTree(){ Create(root); } void BiTree::Create(BiNode * &bt){ input(ch); //輸入節點數據 
    if(ch=='#') bt=NULL;          //建立一顆空樹 
    else{ bt=new BiNode; bt->data=ch;               //生成一個節點,數據域為ch 
        Create(bt->lchild); //前序遍歷方式創建二叉樹
        Create(bt->rchild); } return ; }

 二叉樹的銷毀

void BiTree::release(BiNode* &bt)  // 此處的參數使用引用形式,僅是為了防止出現打印異常。
{ if (bt != NULL) { release(bt->lchild); //后序遍歷銷毀二叉樹 release(bt->rchild); delete bt; bt = NULL; } }

實例

#include<iostream> #include<queue>
using namespace std; struct BiNode{ char data; struct BiNode *lchild,*rchild; }; void Create(BiNode* &root){ char c; cin>>c; if(c=='#') root=NULL; else{ root=new BiNode; root->data=c; Create(root->lchild); Create(root->rchild); } return ; } void PreOrder(BiNode* root){ if(root==NULL) return ; else{ cout<<root->data<<" "; PreOrder(root->lchild); PreOrder(root->rchild); } return ; } void InOrder(BiNode* root){ if(root==NULL) return ; else{ InOrder(root->lchild); cout<<root->data<<" "; InOrder(root->rchild); } return; } void PostOrder(BiNode* root){ if(root==NULL) return ; else{ PostOrder(root->lchild); PostOrder(root->rchild); cout<<root->data<<" "; } } void LeverOrder(BiNode* root){ if(root==NULL) return ; queue<BiNode*> q; q.push(root); while(!q.empty()){ BiNode* tmp=q.front(); cout<<tmp->data<<" "; q.pop(); if(tmp->lchild!=NULL){ q.push(tmp->lchild); } if(tmp->rchild!=NULL){ q.push(tmp->rchild); } } return ; } void deleteBiTree(BiNode* &root){ if(root!=NULL){ deleteBiTree(root->lchild); deleteBiTree(root->rchild); cout<<root->data<<" delete "; delete root; root=NULL; } } int main(){ BiNode* root; Create(root); PreOrder(root); cout<<endl; InOrder(root); cout<<endl; PostOrder(root); cout<<endl; LeverOrder(root); cout<<endl; deleteBiTree(root); }

輸入:

AB#D##C##

輸出:

A B D C
B D A C
D B C A
A B C D
D delete B delete C delete A delete


免責聲明!

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



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