二叉树:距离最近的共同祖先

问题描述 :
  • 目的:使用C++模板设计二叉树的抽象数据类型(ADT)。并在此基础上,使用二叉树ADT的基本操作,设计并实现简单应用的算法设计。

  • 内容:(1)请参照链表的ADT模板,设计二叉树的抽象数据类型。(由于该环境目前仅支持单文件的编译,故将所有内容都集中在一个源文件内。在实际的设计中,推荐将抽象类及对应的派生类分别放在单独的头文件中。参考教材、课件,以及网盘中的链表ADT原型文件,自行设计二叉树的ADT。)

  • 注意:二叉树ADT的基本操作的算法设计很多要用到递归的程序设计方法。

  • (2)ADT的简单应用:使用该ADT设计并实现若干应用二叉树的算法设计。

  • 应用:要求设计一个算法,查找距离二叉树中2个结点最近的共同祖先。二叉树的存储结构的建立参见二叉树应用1。

  • 注意:x、y都是属于该二叉树的结点。

参考函数原型:

//查找距离二叉树中2个结点最近的共同祖先 (用户函数)

template<class ElemType>

BinaryTreeNode<ElemType> * FindNearAncient( BinaryTree<ElemType> &T, ElemType &x, ElemType &y );     

辅助函数:

//查找从根结点到元素值为x的结点的路径 (成员函数,参见基本操作18)

template<class ElemType> //Q为存放路径的顺序队列

void BinaryTree<ElemType>::FindPath( ElemType &x, SqQueue<BinaryTreeNode<ElemType> *> &Q );
输入说明 :

第一行:表示无孩子或指针为空的特殊分隔符

第二行:二叉树的先序序列(结点元素之间以空格分隔)

第三行:元素值x

第四行:元素值y

输出说明 :

第一行:元素值(共同祖先)

如x、y中有根结点,则输出NULL

输入范例 :
#
A B # C D # # E # # F # G # H # #
B
D
输出范例 :
A
思路分析

在这里插入图片描述

  • 将问题转换为找两个字符串的公共子串的最后一个元素
实现伪码
BinaryTreeNode * FindNearAncient( BinaryTree T
                                           , ElemType x, ElemType y ){

    //树为空,就退出
    if(T.BinaryTreeisEmpty()) return NULL;

    //建造两个队列用来保存二者的路径
    SqQueue<BinaryTreeNode*> xQueue,yQueue;

    //生成二者的路径的
    T.FindPath(x,xQueue);
    T.FindPath(y,yQueue);

    //遍历两个队列,找对最后一个公共前缀
    BinaryTreeNode *xNode,*yNode;
    xQueue.deQueue(xNode);
    yQueue.deQueue(yNode);

    //遍历两个队列
    while(xNode->getData() != yNode->getData()){

        //首先队列不是等长的,长的先出
        if(xQueue.getQueueNums() > yQueue.getQueueNums()){
             xQueue.deQueue(xNode);
        }
        else if(xQueue.getQueueNums() < yQueue.getQueueNums()){
            yQueue.deQueue(yNode);

        }else{
            xQueue.deQueue(xNode);
            yQueue.deQueue(yNode);

        }
    }

    //里面还有一个节点可以出队
    if(xQueue.getQueueNums() >= 1)
    {
        xQueue.deQueue(xNode);
        return xNode;

    }else{
        return NULL;

    }
}
事故现场
第一次提交

在这里插入图片描述

  • 我试了很多,但离奇的是,居然都通过了,所以,毫不犹豫地买了样例
    在这里插入图片描述
  • 半截题目没有看清,行吧,认了。
分析总结
  • 题目没有申请,所以,还剩很多,用尽洪荒之力,接着写吧
如果不妥,请在评论区留言,或者加我的扣扣一起讨论学习,651378276
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值