1. 程式人生 > >二叉排序樹C++構造

二叉排序樹C++構造

初次嘗試使用C++來構造二叉排序樹

定義:

二叉排序樹或者是一顆空樹,或者是具有以下性質的樹

1.左子樹(如果存在)上的所有節點的關鍵字都小於根節點的關鍵字

2.右子樹(如果存在)上的所有節點的關鍵字都大於根節點的關鍵字

3.左子樹和右子樹也是二叉排序樹

構造:

首先構造節點

class node
{
public:
    int data;
    node *left,*right;
    node(void){ data = NULL, left = NULL, right = NULL; }
    node(int Data){ data = Data, left
= NULL, right = NULL; } ~node(void); };

構造二叉樹

class CBTree
{
public:
    int maxnum,num;
    node root;
    CBTree(void);
    ~CBTree(void);
    void NodeAdd(node *&Root,node *Data);
    bool NodeSearch(node* Root,int Data);
};
CBTree::CBTree(void)
{
    maxnum=100;
    num=0;
    root=NULL;
}
CBTree::~CBTree(void
) { //析構 }

這樣一棵簡單的二叉樹的基本結構就搞定了,不過要成為具體的二叉
排序樹就需要在節點插入的時候些處理了。

節點插入:

void CBTree::NodeAdd(node* &Node,node* NodeData)
{
    if(num==maxnum)
    {
        cout<<"full"<<endl;
        return;
    }
    if(num==0)
    {
        *Node=*NodeData;
        num++;
    }
    else
    {
        if
(Node==NULL) { Node=NodeData; num++; } else if(Node->data>NodeData->data) NodeAdd(Node->left,NodeData); else NodeAdd(Node->right,NodeData); } }

節點查詢:

bool CBTree::NodeSearch(node* Node,int Data)
{
    if(num==0)
    {
        return false;
    }
    if(Node)
    {
        if(Node->data==Data)
        {
            return true;
        }
        else if(Node->data>Data)
        {
            return NodeSearch(Node->left,Data);
        }
        else
        {
            return NodeSearch(Node->right,Data);
        }
    }
    else
    {
        return false;
    }
}

構造一棵二叉排序樹:

void main()
{
    int i,a;
    CBTree Btree;
    node *Node,*Root=&Btree.root;
    for(i=0;i<10;i++)
    {
        cin>>a;
        while(Btree.NodeSearchRoot, a))
        {
            cout << "已存在,請重新輸入" << endl;
            cin >> a;
        }
        Node=new node(a);           
        Btree.NodeAdd(Root,Node)
    }
}