【王道数据结构】【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;
}
相关推荐
生锈的键盘几秒前
推荐算法实践:交叉特征的理解
算法
小龙报6 分钟前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
小武编程9 分钟前
基于JL700N可视化SDK的MAC地址应用
c语言·tws耳机·杰理jl700n
dllxhcjla10 分钟前
数据结构和算法
数据结构
乌萨奇也要立志学C++13 分钟前
【洛谷】BFS 求解最短路:从马的遍历到迷宫问题的实战解析
算法·宽度优先
石去皿17 分钟前
【嵌入式就业6】计算机组成原理与操作系统核心机制:夯实底层基础
c++·面试·嵌入式
王老师青少年编程18 分钟前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第1题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
老鼠只爱大米22 分钟前
LeetCode经典算法面试题 #46:全排列(回溯、交换、剪枝等五种实现方案详细解析)
算法·leetcode·剪枝·回溯·全排列·stj算法
Dovis(誓平步青云)36 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
一只小小的芙厨1 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解