二叉查找树

hpl_computer 2009-06-20 10:29:22
有【1,10000】自然数,构建一颗二叉查找树,应该怎么构建。
...全文
77 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenhuahetao 2009-09-15
  • 打赏
  • 举报
回复
严蔚敏c语言版本要吗
我已做好了
调试成功
要callme
qq810097972
tfsict2008 2009-06-28
  • 打赏
  • 举报
回复
二叉查找树的形状和你给出的数列的顺序有关
  • 打赏
  • 举报
回复
学习
rlfzyhddsw 2009-06-27
  • 打赏
  • 举报
回复
mark
yezeguo 2009-06-25
  • 打赏
  • 举报
回复
这个回去发你代码
wrx4532622 2009-06-24
  • 打赏
  • 举报
回复
不 错
很 好 ~!!~
weilu0328 2009-06-23
  • 打赏
  • 举报
回复
数据结构中不是已经介绍过了嘛,LZ可以回头看看数据结构吧。
lll002 2009-06-23
  • 打赏
  • 举报
回复
数据结构书上就有
贝隆 2009-06-23
  • 打赏
  • 举报
回复
学习
qq675927952 2009-06-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jlusuperwind 的回复:]
每读入一个数,都按照如下递归规则构建查找树:
1.如果存在左子树,则左子树的数小于根
2.如果存在右子树,则右子树的数大于根

如果输入的数是已经排序的,如从小到大,按照上述规则的话就会使树的高度太高,
可以使用平衡二叉查找树
[/Quote]

up 看看


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


jlusuperwind 2009-06-23
  • 打赏
  • 举报
回复
每读入一个数,都按照如下递归规则构建查找树:
1.如果存在左子树,则左子树的数小于根
2.如果存在右子树,则右子树的数大于根

如果输入的数是已经排序的,如从小到大,按照上述规则的话就会使树的高度太高,
可以使用平衡二叉查找树
learnEmbeddedDev 2009-06-22
  • 打赏
  • 举报
回复
二叉查找树是不是就是二叉排序树?
可以有先根遍历, 中序便利, 后根遍历递归方式, 比较一下。。。
acdbxzyw 2009-06-21
  • 打赏
  • 举报
回复
www.g.cn
neohope 2009-06-20
  • 打赏
  • 举报
回复
你把数字按从小到大派类,就是二叉树的中序历遍了

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧