c++建立二叉搜索樹


二叉搜索樹

二叉搜索樹是指在插入數據的時候,與根節點比較,大小有序的進入樹中找的位置並儲存。

實現方法

數據進入樹中,與樹的根節點比較,大的話放在左邊(右邊),小的話放在右邊(左邊)。

#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;
    }
}


免責聲明!

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



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