B-tree的构造及相关操作

#include "bttool.h"


int main()
{
   ElemType data;
   treeNode* root;
   treeNode* treenode;
   root = new treeNode;
   treenode = new treeNode;

   cin>>data;
   treenode = creatbtree(root,data);
   root = treenode;
   while(1)
   {
       cin>>data;
       if(data==0)
       {
           break;
       }
       treenode = creatbtree(root,data);
   }

/*
  cout<<"print  preorderbtree:\n";
  preorderbtree(root);
  cout<<endl;
*/

/*
  cout<<"print inorderbtree:\n";
  inorderbtree(root);
  cout<<endl;
*/

//
//cout<<"print postorderbtree:\n";
//postorderbtree(root);
//cout<<endl;
//


/*
//add  tree node
//preorderbtree(root);
cout<<"\nadd one node:\n";
ElemType adddata;
cin>>newdata;
//treenode = creatbtree(root,adddata);
//treeNode* newtreeroot;
addtreenode(root,newdata);
cout<<"\nthe new b tree:\n";
//preorderbtree(newtreeroot);
inorderbtree(root);
cout<<endl;
*/

/*
//find data
cout<<"input the number:\n";
ElemType finddata;
treeNode* findpnode;
findpnode = new treeNode;
cin>>finddata;
findpnode=findnode(root,finddata);
if(findpnode!=NULL)
{
    cout<<findpnode->data<<" is  find.\n";
}
else
{
    cout<<finddata<<"is not exist.\n";
}
delete findpnode;
*/



//count the nunber of leaves node
int  leavesnum;
leavesnum = findleavesnode(root);
cout<<"the number of leaves  is: "<<leavesnum;
cout<<endl;



/*
//calculate deepth
int dptree;
dptree = calculatedeep(root);
cout<<"the deepth of the tree is: "<<dptree;
cout<<endl;
*/

  return 0;
}

#ifndef _CREAT_B_TREE_
#define _CREAT_B_TREE_

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

typedef int ElemType;

struct treeNode
{
    ElemType data;
    treeNode *tleft;
    treeNode *tright;
};

treeNode* creatbtree(treeNode* root,ElemType data);
void preorderbtree(treeNode* root);
void inorderbtree(treeNode* root);
void postorderbtree(treeNode* root);
void addtreenode(treeNode* root,ElemType data);
treeNode* findnode(treeNode* root,ElemType data);
int findleavesnode(treeNode* root);
int calculatedeep(treeNode* root);
 void clearbtree(treeNode* root);


#endif // _CREAT_B_TREE_



#include "bttool.h"

treeNode* creatbtree(treeNode* root,ElemType data)
{
    treeNode* newnode;
    newnode = new treeNode;
    newnode->data = data;
    newnode->tleft = NULL;
    newnode->tright = NULL;

    if(root == NULL)
    {
        root = newnode;
    }
    else
    {
        treeNode* backnode = NULL;
        treeNode* currentnode = root;
        while(currentnode!=NULL)
        {
            backnode = currentnode;
            if(currentnode->data>data)
            {
                currentnode = currentnode->tleft;
            }
            else if(currentnode->data<data)
            {
                currentnode = currentnode->tright;
            }
            else
                delete newnode;
        }

        if(backnode->data>data)
        {
            backnode->tleft = newnode;
        }
        else
        {
            backnode->tright = newnode;
        }
        return root;
    }


}

void preorderbtree(treeNode* root)
{
    treeNode* treenode;
    treenode = new treeNode;
    treenode = root;
    if(treenode == NULL)
    {
        return;
    }
    else
    {
        cout<<treenode->data<<"\t";
        preorderbtree(treenode->tleft);
        preorderbtree(treenode->tright);
    }
    delete treenode;
}

void inorderbtree(treeNode* root)
{
    treeNode* treenode;
    treenode = new treeNode;
    treenode = root;
    if(treenode == NULL)
    {
        return ;
    }
    else
    {
        inorderbtree(treenode->tleft);
        cout<<treenode->data<<"\t";
        inorderbtree(treenode->tright);
    }
    delete treenode;
}

void postorderbtree(treeNode* root)
{
    treeNode* treenode;
    treenode = new treeNode;
    treenode = root;
    if(treenode==NULL)
    {
        return ;
    }
    else
    {
        postorderbtree(treenode->tleft);
        postorderbtree(treenode->tright);
        cout<<treenode->data<<"\t";
    }
    delete treenode;
}

void addtreenode(treeNode* root,ElemType data)
{
    treeNode* newnode;
    newnode = new treeNode;
    newnode->data=data;
    newnode->tleft=NULL;
    newnode->tright=NULL;

    if(root == NULL)
    {
        root = newnode;
        delete newnode;
        return ;
    }
    else
    {
        treeNode* currentnode = root;
        treeNode* backnode = NULL;
        while(currentnode!=NULL)
        {
            backnode = currentnode;
           if(currentnode->data > data)
           {
               currentnode = currentnode->tleft;
           }
           else if(currentnode->data < data)
           {
               currentnode = currentnode->tright;
           }
           else
           {
               //cout<<"this node is exist!!!\n";
               delete newnode;
           }
        }

        if(backnode->data > data)
        {
            backnode->tleft = newnode;
            cout<<"done\n";
        }
        else
        {
            backnode->tright = newnode;
            cout<<"done\n";
        }
        return ;
    }
}


treeNode* findnode(treeNode* root,ElemType data)
{
    treeNode* pnode;
    pnode = new treeNode;
    pnode = root;
    if(pnode == NULL)
    {
        return NULL;
    }
    else
    {
        if(pnode->data==data)
            return pnode;
        else
        {
            if(pnode->data>data)
                return findnode(pnode->tleft,data);
            else
                return findnode(pnode->tright,data);
            return NULL;
        }
    }
    delete pnode;
}

int findleavesnode(treeNode* root)
{
    static int node_count=0;
    treeNode* pnode;
    pnode = new treeNode;
    pnode = root;
    if(pnode == NULL)
    {
        return node_count;
    }
    else
    {
        if(pnode->tleft == NULL &&  pnode->tright == NULL)
        {
            cout<<pnode->data<<endl;
            node_count++;
        }
        else
        {
            findleavesnode(pnode->tleft);
             findleavesnode(pnode->tright);
        }
        return node_count;
    }
}

 int calculatedeep(treeNode* root)
 {
     treeNode* pnode;
     pnode = new treeNode;
     pnode = root;
     int dpleft = 0;
     int dpright = 0;
     if(pnode == NULL)
     {
         return 0;
     }
     else
     {
         dpleft = calculatedeep(pnode->tleft);
         dpright = calculatedeep(pnode->tright);
     }
     if(dpleft>dpright)
     {
         return ++dpleft;
     }
     else
     {
         return ++dpright;
     }
 }


 void clearbtree(treeNode* root)
 {
     if(root)
     {
         clearbtree(root->tleft);
         clearbtree(root->tright);
         delete root;
     }
 }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值