数据结构(c语言版)(第2版双色版)-习题答案

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

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
已知二叉排序树采用二叉链表存储结构,根结点的指针为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) {f=p; p=p->lchild ; //找第一个值<x的结点 while (p && p->data≥x) //沿左分枝向下,找第一个值<x的结点 {f=p; p=p->lchild ; } //f是p的双亲结点的指针,指向第一个值≥x的结点 if(p) f->lchild=null; //双亲与找到的第一个值<x的结点断开 Print(bst); //输出以bst为根的子树 }//while }//内层if (p) }//第一层if (p) }//PrintAllx