【王道数据结构】【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;
}
相关推荐
凤年徐24 分钟前
【数据结构初阶】单链表
c语言·开发语言·数据结构·c++·经验分享·笔记·链表
oioihoii26 分钟前
C++11 右值引用:从入门到精通
开发语言·c++
木子.李3474 小时前
排序算法总结(C++)
c++·算法·排序算法
闪电麦坤955 小时前
数据结构:递归的种类(Types of Recursion)
数据结构·算法
freyazzr6 小时前
C++八股 | Day2 | atom/函数指针/指针函数/struct、Class/静态局部变量、局部变量、全局变量/强制类型转换
c++
小熊猫写算法er6 小时前
终极数据结构详解:从理论到实践
数据结构
Gyoku Mint6 小时前
机器学习×第二卷:概念下篇——她不再只是模仿,而是开始决定怎么靠近你
人工智能·python·算法·机器学习·pandas·ai编程·matplotlib
纪元A梦6 小时前
分布式拜占庭容错算法——PBFT算法深度解析
java·分布式·算法
fpcc6 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
px不是xp7 小时前
山东大学算法设计与分析复习笔记
笔记·算法·贪心算法·动态规划·图搜索算法