更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
已知二叉排序树采用二叉链表存储结构,根结点的指针为T,结点的结构为(lchild,data,rchild),其中lchild,rchild分别指向该结点左、右孩子的指针,data域存放结点的数据信息。请写出递归算法,从小到大输出二叉排序树中所有数据值≥x的结点的数据。要求先找到第一个满足条件的结点后,再依次输出其他满足条件的结点。 [题目分析]本题算法之一是如上题一样,中序遍历二叉树,在“访问根结点”处判断结点值是否≥x,若是则输出,并记住第一个≥x值结点的指针。这里给出另一个算法,利用二叉排序树的性质,如果根结点的值≥x,则除左分枝中可能有<x的结点外都应输出。所以从根结点开始查找,找到结点值<x的结点后,将其与双亲断开并输出整棵二叉排序树。如果根结点的值<x,则沿右子树查找第一个≥x的结点,找到后,与上面同样处理。 [算法描述] void Print(BSTree t) // 中序输出以t为根的二叉排序树的结点 {if(t){Print(t->lchild); Cout<<t->data; Print(t->rchild); } } void PrintAllx(BSTree bst,datatype x) //在二叉排序树bst中,查找值≥x的结点并输出 {p=bst; if(p) {while(p && p->data<x)p=p->rchild;//沿右分枝找第一个的值≥x的结点 bst=p;//bst所指结点是值≥x的结点的树的根 if(p) {p=p->lchild;//找第一个值<x的结点 {f=p;while(p && p->data≥x)//沿左分枝向下,找第一个值<x的结点 f=p;p=p->lchild ;}//f是p的双亲结点的指针,指向第一个值≥x的结点 if(f->lchild!=null;//双亲与找到的第一个值<x的结点断开 Print(bst);//输出以bst为根的子树 }//内层if(p) }//第一层if(p) }//PrintAllx