二叉搜索樹
二叉搜索樹是指在插入數據的時候,與根節點比較,大小有序的進入樹中找的位置並儲存。
實現方法
數據進入樹中,與樹的根節點比較,大的話放在左邊(右邊),小的話放在右邊(左邊)。
#include <iostream> #include <vector> using namespace std; typedef struct Std { int iNum; struct Std *left; struct Std *right; }Tree; vector<vector<int> > prder;//用於層次遍歷 //一,創建空樹樹 Tree* CreateTree(int iNumroot); //二,插入數據 void InsertTree(Tree* Head,int n); //三,刪除節點 Tree* Delete(Tree* Head,int n); //四,層次遍歷 vector<vector<int> > Layer_Tree(Tree* Head); void layertree(Tree* Head,int n); //四.2,輸出數據 void Point(); int main () { Tree* root; int iNumroot; int iNumber; //輸入樹根 cout<<"輸入樹根:"<<endl; cin>>iNumroot; root=CreateTree(iNumroot); //輸入數據的個數 cout<<"輸入數據個數:"<<endl; cin>>iNumber; cout<<"輸入數據:"; for(int i=0;i<iNumber;i++) { int a; cin>>a; InsertTree(root,a); } //刪除節點 cout<<"輸入要刪除的節點:"; int m; cin>>m; root=Delete(root,m); //層次輸出數據 prder=Layer_Tree(root); Point(); return 0; } Tree* CreateTree(int iNumroot) { Tree* Head; Head=new Tree; (*Head).iNum=iNumroot; Head->left=NULL; Head->right=NULL; return Head; } void InsertTree(Tree* Head,int n) { if(n>Head->iNum) { if(Head->right) { InsertTree(Head->right,n); } else { Tree* New=new Tree; (*New).iNum=n; New->left=NULL; New->right=NULL; Head->right=New; return; } } else { if(Head->left) { InsertTree(Head->left,n); } else { Tree* New=new Tree; (*New).iNum=n; New->left=NULL; New->right=NULL; Head->left=New; return; } } } vector<vector<int> > Layer_Tree(Tree* Head) { if(!Head) return prder; layertree(Head,0); return prder; } Tree* Delete(Tree* Head,int n) { if(!Head) { cout<<"刪除的節點不存在!"<<endl; } if(n==Head->iNum) { if(Head->left&&Head->right) { Tree* cur=Head->right; while(cur->iNum!=NULL) { cur=cur->left; } Head->iNum=cur->iNum; Head->right=Delete(Head->right,cur->iNum); } else if(!Head->left&&!Head->right) { return NULL; } else { Head=(Head->left==NULL)?Head->right:Head->left; } } else if(n>Head->iNum) { Head->right=Delete(Head->right,n); } else { Head->left=Delete(Head->left,n); } return Head; } void layertree(Tree* Head,int n) { if(!Head) return; if(n>=prder.size()) { vector<int> x; prder.push_back(x); } prder[n].push_back(Head->iNum); layertree(Head->left,n+1); layertree(Head->right,n+1); } void Point() { for(int i=0;i<prder.size();i++) { if(prder[i].empty()) { cout<<"N"<<" "; } for(int j=0;j<prder[i].size();j++) { cout<<prder[i][j]<<" "; } cout<<endl; } }