【王道数据结构】【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;
}
相关推荐
样例过了就是过了1 分钟前
LeetCode热题100 分割回文串
数据结构·c++·算法·leetcode·深度优先·dfs
Yvonne爱编码23 分钟前
JAVA数据结构 DAY8-堆
java·数据结构·python
阿猿收手吧!27 分钟前
【C++】高并发内存池架构与设计解析
开发语言·c++·架构
带娃的IT创业者34 分钟前
WeClaw 心跳与重连实战:指数退避算法如何让 WebSocket 在弱网环境下的连接成功率提升 67%?
python·websocket·网络协议·算法·fastapi·实时通信
唠玖馆35 分钟前
c++ 类和对象(全)
java·开发语言·c++
Morwit1 小时前
【力扣hot100】 85. 最大矩形
c++·算法·leetcode·职场和发展
艾醒1 小时前
MiniMax M2.5:从黑马到全球顶流的"前世今生"与趣闻
算法
爱编码的小八嘎1 小时前
C语言完美演绎4-2
c语言
m0_528174451 小时前
C++中的代理模式变体
开发语言·c++·算法
mjhcsp1 小时前
C++ 折半搜索(Meet in the Middle):突破指数级复杂度的分治策略
开发语言·c++