33,028
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include <stack>
using namespace std;
typedef struct TreeNode
{
int data;
int NodeNum;//用来记录相同结点的个数
TreeNode *lchild;
TreeNode *rchild;
}treeNode;
class BiSortTree
{
public:
BiSortTree();
void displayTree();//显示这个树
treeNode* insertNode(treeNode* Head,int number);//树中插入一个结点
int deleteTree(int key);//在树中删除一个值
treeNode* searchTree(int key);//在树中查找一个值
~BiSortTree();
private:
void output(treeNode* head);
treeNode *Head;
treeNode* searchParent(treeNode* p);//查找出p的父亲节点的指针
void destroyTree(treeNode* head );
};
/********构造函数构建一个树*******/
BiSortTree::BiSortTree()
{
Head=NULL;
int number;
cout<<"建立一棵二叉排序树,请输入你要建树的所有数(以-1 作为结束标志!): "<<endl;
while(cin>>number,number!=-1)
{
Head=insertNode(Head,number);
}
}
/*********以下是插入一个结点*******/
treeNode* BiSortTree::insertNode(treeNode* Head,int number)
{
treeNode* p,*q;//注意两个都要加*号;treeNode* p,q;这样不行
treeNode* s=new treeNode;
s->data=number;
s->rchild=s->lchild=NULL;
p=Head;
if(Head==NULL) return s;//此时s为根
while(p!=NULL)
{
q = p; //用q保存p,q为p的父结点
if(p->data==number)
{
p->NodeNum++;
return Head;
}
else if(number<p->data)
p=p->lchild;
else p=p->rchild;
}
//q是子结点
if(number>q->data)q->rchild=s;//在右子树中插入
else q->lchild=s; //在左子树插入
s->NodeNum=1;
return Head;
}
treeNode* BiSortTree::searchTree(int key)//在树中查找一个值,找到返回结点指针,否则NULL
{
treeNode* p=Head;
while(p!=NULL)
{
if(key==p->data)return p;
else if(key>p->data)p=p->rchild;
else p=p->lchild;
}
if(p==NULL)return NULL;
}
treeNode* BiSortTree::searchParent(treeNode* p)//查找出p的父亲节点的指针
{
treeNode * q=Head;
treeNode *parent=Head;
while(q!=NULL)
{
if(p->data==q->data) return parent;
else if(p->data<q->data){ parent=q; q=q->lchild;}
else { parent=q; q=q->rchild;}
}
if(q==NULL)return NULL;
}
int BiSortTree::deleteTree(int key)
{
treeNode* p=searchTree(key);
if(p==NULL)return 0;//没找到
else
{
treeNode* parent=searchParent(p);
if(p->lchild==NULL&&p->rchild==NULL)//叶子结点
{
if(parent->lchild==p)parent->lchild=NULL;
else parent->rchild=NULL;
}
else
{
if(p->rchild==NULL)//没右子树,只有左子树
{
if(parent->lchild==p)
parent->lchild=p->lchild;
else parent->rchild=p->lchild;
}
else //有左子树和右子树
{
parent->lchild=p->lchild;//p左子树直接挂到父结点左子树上
treeNode *s=p->lchild;
while(s->rchild) // p左子的最右子 存在s 中
{
s=s->rchild;
}
s->rchild=p->rchild; //p的右子树直接挂到 p左子的最右子 的右子树上
delete p;
}
}
}
return 1;
}
void BiSortTree::destroyTree(treeNode* head )
{
if(head!=NULL)
{
destroyTree(head->lchild );
destroyTree(head->rchild );
delete head;
}
}
void BiSortTree::output(treeNode* head)
{
if(head)
{
if(head->lchild)
output(head->lchild);
cout<<head->data<<" ";
if(head->rchild)
output(head->rchild);
}
}
void BiSortTree::displayTree()
{
output(Head);
}
BiSortTree::~BiSortTree()
{
destroyTree(Head);
}
int main()
{ int n;
BiSortTree T;
T.displayTree();
cin>>n;
return 0;
}