判断二叉树是否为二叉排序树的递归算法

frankzch 2004-01-13 09:37:45
判断二叉树是否为二叉排序树的递归算法
希望有一个用类C写的程序
这是一道考研的题目
...全文
2898 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
weimj 2004-01-14
  • 打赏
  • 举报
回复
那就这样:
typedef struct node{
int data;
struct node *left, *right;
}NODE;

int judge(NODE *p, int leftbound, int rightbound) {
if (p==NULL) return 1;
if (p->data < leftbound || p->data > rightbound) return 0;//不要等号
if (!judge(p->left,leftbound,p->data)) return 0;
if (!judge(p->right, p->data,rightbound)) return 0;
return 1;
}
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
to LeeMaRS(小菜虎,仍需努力)
我前面的程序写的稍微有点繁,谢谢你帮我改了一下
不过有一个问题,在你改过的程序里面就得不到正确结果了,这也是为什么我当初写的那么繁的原因
如果排序树里面存在两个数相等的话,我是把相等的数放在右子树,直接和与它相等的数相连
在我原来的程序里,对于每个结点,对左右子树键值的判断和对两个bound的判断是不一样的
而在你改过的程序里,都是按照同一种方式判断,如果有两个数相等,而且一个数是另一个数的右子结点,这种情况下你的程序返回0
CEN0921 2004-01-14
  • 打赏
  • 举报
回复
int last=0,flag=1;
int Is_BSTree(Bitree T)//判断二叉树T是否二叉排序树,是则返回1,否则返回0
{
if(T->lchild&&flag) Is_BSTree(T->lchild);
if(T->data<last) flag=0; //与其中序前驱相比较
last=T->data;
if(T->rchild&&flag) Is_BSTree(T->rchild);
return flag;
}
iwillwin 2004-01-14
  • 打赏
  • 举报
回复
原理就是中序遍历此二叉树,看得到的序列是否有序就可以了。其实用非递归的算法写实很简单的。用递归的算法写就是楼上的这样子。
LeeMaRS 2004-01-14
  • 打赏
  • 举报
回复
呵呵, 就是界限. 二叉排序树的性质: 根值为value, 则左子树值都小于根, 右子树值大于根. 即左子树值 (-maxint, value) 范围内, 右子树值在(value, maxint)范围内.

typedef struct node{
int data;
struct node *left, *right;
}NODE;

int judge(NODE *p, int leftbound, int rightbound) {
if (p==NULL) return 1;
if (p->data <= leftbound || p->data >= rightbound) return 0;
if (!judge(p->left,leftbound,p->data)) return 0;
if (!judge(p->right, p->data,rightbound)) return 0;
return 1;
}

借用mysword的程序改了一下, 这样应该就行了.
weimj 2004-01-14
  • 打赏
  • 举报
回复
if (!judge(p->left,leftbound,p->data)) return 0;
if (!judge(p->right, p->data,rightbound)) return 0;
递归调用时变了呀
frankzch 2004-01-14
  • 打赏
  • 举报
回复
你的leftbound rightbound是设置的界限?为什么在函数里面没有重新赋值?值一直不变的吗?
LeeMaRS 2004-01-14
  • 打赏
  • 举报
回复
依照算法导论中的定义, 相同的放左放右都可以的. 这样的话按 weimj() 的就行了.

但似乎这样定义的话, 二叉排序树的性质就要大受影响了.
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
算法导论里面二叉查找树是允许有相同值的
不知道以哪个定义为准?
LeeMaRS 2004-01-14
  • 打赏
  • 举报
回复
二叉排序树中是不存在相同值的结点的. 我参考的是严蔚敏的<<数据结构>>的定义. :)
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
调用的时候只需要看看judge(head,-maxint,maxint)是不是为1就可以了
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
typedef struct node{
int data;
struct node *left, *right;
}NODE;

int judge(NODE *p, int leftbound, int rightbound) {
if (p==NULL) return 1;
if (p->left!=NULL && (p->left->data>=p->data || p->left->data<=leftbound)) return 0;
if (p->right!=NULL && (p->right->data<p->data || p->right->data>=rightbound)) return 0;
if (!judge(p->left,leftbound,p->data)) return 0;
if (!judge(p->right, p->data,rightbound)) return 0;
return 1;
}
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
sorry,我搞错了
这样的情况应该允许存在,酱紫
gnefuil 2004-01-14
  • 打赏
  • 举报
回复
这样也是不行的
举个例子:
10
20
/
10
对于最底下的10,leftbound是10,rightbound是20
用上面的程序判断不出来,实际上这种情况在排序二叉树里不应该存在
jettylee 2004-01-13
  • 打赏
  • 举报
回复
基本思想是中序遍历看看是否有序
写过的以前 现在忘记了
等下帮你找找看
做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。

33,008

社区成员

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

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