二叉搜索树

二叉搜索树是指在插入数据的时候,与根节点比较,大小有序的进入树中找的位置并储存。

实现方法

数据进入树中,与树的根节点比较,大的话放在左边(右边),小的话放在右边(左边)。

#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;
    }
}
12-25 09:07