ch09_ex33 从大到小输出给定二叉排…

来源:互联网 发布:微信推送表情包 知乎 编辑:程序博客网 时间:2024/06/07 05:00
9.33③ 编写递归算法,从大到小输出给定二叉排序树
中所有关键字不小于x的数据元素。要求你的算法的时
间复杂度为O(log2n+m),其中n为排序树中所含结点数,
m为输出的关键字个数。

实现下列函数:
void OrderOut(BiTree t, KeyType x,void(*visit)(TElemType));

二叉树的类型BiTree定义如下:
typedef struct {
    KeyType key; 
    ... ...  // 其他数据域
} ElemType;

typedef struct BiTNode {
    ElemType data;
    BiTNode *lchild,*rchild;
}BiTNode, *BiTree;

答案以及解析:
版本一:
void OrderOut(BiTree t, KeyType x,void(*visit)(TElemType))
{
    if(!t) return;//
    elseif(t->data.key>=x)//满足要求则按照中序遍历输出,才能保证从大到小的顺序
    {
      OrderOut(t->rchild,x,visit);
       visit(t->data);
      OrderOut(t->lchild,x,visit);
    }
    elseif(t->rchild)OrderOut(t->rchild,x,visit); 
}
版本二:
void OrderOut(BiTree t, KeyType x,void(*visit)(TElemType))
{
    if(!t) return;
   OrderOut(t->rchild,x,visit);
   if(t->data.key>=x)visit(t->data);   
   OrderOut(t->lchild,x,visit);       
}
外来答案:本人感受,简单的函数何必再另外建一个新函数;此外用flag做控制多了一个接口,问题更多
void out(BiTree t,KeyType x,int&flag,void(*visit)(TElemType));
void OrderOut(BiTree t, KeyType x,void(*visit)(TElemType))
{
 int flag=1;
 out(t,x,flag,visit);
}
void out(BiTree t,KeyType x,int&flag,void(*visit)(TElemType))
{
 if(t->rchild)out(t->rchild,x,flag,visit);
 if(t->data.key
 if(flag)
  {visit(t->data);
   if(t->lchild)out(t->lchild,x,flag,visit);
    }
}
总结:时间复杂度问题,本人真心不知道怎么计算,版本一是符合要求的O(log2n+m),版本二的则为O(log2n+n)
0 0