【王道数据结构】【chapter5树与二叉树】【P159t12】

设一棵二叉树的结点结构为(LLINK,INFO,RLINK),ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个节点的指针,试编写算法ANCESTOR(ROOT,p,q,r),找到p和q的最近公共祖先结点r

cpp 复制代码
#include <iostream>
#include <stack>
#include<queue>
typedef struct treenode{
    char INFO;
    struct treenode *LLINK;
    struct treenode *RLINK;
}treenode,*ptreenode;

ptreenode buytreenode(char x)
{
    ptreenode n=(ptreenode) malloc(sizeof (treenode));
    n->INFO=x;
    n->LLINK= nullptr,n->RLINK= nullptr;
    return n;
}

ptreenode build_tree()
{
    ptreenode root= buytreenode('A');
    root->LLINK= buytreenode('B');
    root->RLINK= buytreenode('C');
    root->LLINK->LLINK= buytreenode('D');
    root->LLINK->RLINK= buytreenode('E');
    root->RLINK->LLINK= buytreenode('F');
    root->RLINK->RLINK= buytreenode('G');
    root->LLINK->LLINK->LLINK= buytreenode('H');
    root->LLINK->LLINK->RLINK= buytreenode('I');
    return root;
}


void print_tree(ptreenode root) {
    std::queue<ptreenode> tmp;
    tmp.push(root);
    int s = tmp.size();
    while (!tmp.empty()) {
        ptreenode t = tmp.front();
        tmp.pop();
        s--;
        printf("%3c", t->INFO);
        if (t->LLINK) tmp.push(t->LLINK);
        if (t->RLINK) tmp.push(t->RLINK);
        if (s == 0) puts(""), s = tmp.size();
    }
}

ptreenode ancestor(ptreenode root,ptreenode p,ptreenode q)
{
    if(root==q||root==p||root== nullptr) return root;
    ptreenode left= ancestor(root->LLINK,p,q);
    ptreenode right= ancestor(root->RLINK,p,q);
    if(left!= nullptr&&right!= nullptr) return root;
    if(left== nullptr) return right;
    return left;
    //如果left和right都是空的,那么返回其中任意一个就行,也就是返回空
}
int main() {
    ptreenode root=build_tree();
    print_tree(root);

    puts("");
    printf("%3c\n",ancestor(root,root->LLINK->LLINK,root->LLINK->RLINK)->INFO);

    puts("");
    printf("%3c\n",ancestor(root,root->LLINK->LLINK->LLINK,root->LLINK->LLINK->RLINK)->INFO);
    return 0;
}
相关推荐
luckys.one1 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
~|Bernard|3 小时前
在 PyCharm 里怎么“点鼠标”完成指令同样的运行操作
算法·conda
战术摸鱼大师3 小时前
电机控制(四)-级联PID控制器与参数整定(MATLAB&Simulink)
算法·matlab·运动控制·电机控制
Christo33 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
鹿鹿学长4 小时前
2025年全国大学生数学建模竞赛(C题) 建模解析|婴儿染色体数学建模|小鹿学长带队指引全代码文章与思路
c语言·开发语言·数学建模
好家伙VCC4 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
伴杯猫4 小时前
【ESP32-IDF】基础外设开发2:系统中断矩阵
c语言·单片机·嵌入式硬件·mcu·物联网·github
利刃大大5 小时前
【高并发内存池】五、页缓存的设计
c++·缓存·项目·内存池
lwewan5 小时前
26考研——内存管理_内存管理策略(3)
考研
C语言小火车5 小时前
【C++八股文】基础知识篇
c++·tcp/ip·const·智能指针·多线程同步·static关键字·c++内存模型