聲明:內容及圖片基於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