设计非递归算法,编程:在二叉排序树中,打印关键码a, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。

二叉排序树:

代码:

#include <iostream>
using namespace std;

// 定义二叉树节点结构
typedef struct BTNode {
    char show;
    struct BTNode* left;
    struct BTNode* right;
} BTNode;

// 非递归插入节点的函数
BTNode* insertNode(BTNode* root, char key) {
    BTNode* newNode = new BTNode{key, nullptr, nullptr};
    if (root == nullptr) {
        return newNode;
    }

    BTNode* parent = nullptr;
    BTNode* current = root;

    while (current != nullptr) {
        parent = current;
        if (key < current->show) {
            current = current->left;
        } else if (key > current->show) {
            current = current->right;
        } else {
            // 如果键已经存在,不插入重复的节点
            delete newNode;
            return root;
        }
    }

    if (key < parent->show) {
        parent->left = newNode;
    } else {
        parent->right = newNode;
    }

    return root;
}

// 根据数值查找节点的函数
BTNode* findNodeByValue(BTNode* root, char value) {
    BTNode* current = root;
    while (current != nullptr && current->show != value) {
        if (value < current->show) {
            current = current->left;
        } else {
            current = current->right;
        }
    }
    return current;
}

// 判断是否是祖先节点的函数
bool isAncestor(BTNode* root, BTNode* node) {
    if (root == nullptr) return false;
    if (root == node) return true;
    return isAncestor(root->left, node) || isAncestor(root->right, node);
}

// 寻找公共祖先的函数
BTNode* findCommonAncestor(BTNode* root, char a, char b) {
    // 边界情况处理
    if (root == nullptr) return nullptr;

    // 确保 a 小于 b
    if (a > b) swap(a, b);

    BTNode* nodeA = findNodeByValue(root, a);
    BTNode* nodeB = findNodeByValue(root, b);

    // 判断是否 a 是 b 的祖先或者 b 是 a 的祖先
    if (nodeA && nodeB) {
        if (isAncestor(nodeA, nodeB) || isAncestor(nodeB, nodeA)) {
            return nullptr;
        }
    }

    while (root) {
        if (root->show < a) {
            root = root->right;
        } else if (root->show > b) {
            root = root->left;
        } else {
            return root;
        }
    }

    return nullptr;
}

// 测试用例
void printCommonAncestor(BTNode* root, char a, char b) {
    BTNode* ancestor = findCommonAncestor(root, a, b);
    if (ancestor) {
        cout << a << "和" << b << "的公共祖先是:" << ancestor->show << endl;
    } else {
        cout << a << "和" << b << "没有公共祖先" << endl;
    }
}

// 主函数
int main() {
    // 构建二叉搜索树
    BTNode* root = nullptr;
    root = insertNode(root, 'F');
    root = insertNode(root, 'B');
    root = insertNode(root, 'G');
    root = insertNode(root, 'A');
    root = insertNode(root, 'D');
    root = insertNode(root, 'I');
    root = insertNode(root, 'C');
    root = insertNode(root, 'E');
    root = insertNode(root, 'H');

    // 输入要查询的两个字符
    char x, y;
    cout << "请输入要查询的两个字符: ";
    cin >> x >> y;

    // 根据数值查找节点并打印结果
    BTNode* nodeX = findNodeByValue(root, x);
    BTNode* nodeY = findNodeByValue(root, y);
    if (nodeX && nodeY) {
        printCommonAncestor(root, nodeX->show, nodeY->show);
    } else {
        cout << "输入的字符不在二叉搜索树中" << endl;
    }

    // 释放内存(这里简单起见不进行内存释放)

    return 0;
}

运行截图:

示例1:

示例2:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fastadmin对登录token的处理

fastadmin对token的操作 最近开发遇到一个场景&#xff0c;需要绕过验证获取登录&#xff0c;所以恶补了一下这个知识点&#xff0c;这个主要就是控制fastadmin的token的问题 代码分步实现 class Xcxuser extends Api {//关于鉴权protected $noNeedLogin [login,getopenid,…

Java:使用BigDecimal、NumberFormat和DecimalFormat保留小数

一、代码和调试结果 1.1 BigDecimal ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fa36749de8124266a730817710fdf737.png) 1.2 DecimalFormat 1.3 NumberFormat 二、原代码 BigDecimalUtil.java 代码 package utils;import java.math.BigDecimal; import jav…

【Qt】Qt开源项目

1、Flameshot 截图工具 1.1 简介 Flameshot是一款功能强大但易于使用的屏幕截图软件,中文名称火焰截图。 Flameshot 简单易用并有一个CLI版本,所以可以从命令行来进行截图。 Flameshot 是一个Linux发行版中完全免费且开源的截图工具 1.2 源码 github:https://github.com…

申请一个开发者域名

申请一个开发者域名 教程 fourm.js.org 因本地没安装 hexo 环境&#xff0c;模板下载的 html

代理IP与网络隐私

随着科技的发展&#xff0c;越来越多的人开始享受网络的便利&#xff0c;人们逐步在社交媒体上分享自己的生活。这些公开信息是可以被所有人浏览观看的&#xff0c;但是也会存在部分隐私信息我们并不想要被人知晓&#xff0c;这就牵扯到网络隐私保护问题。 代理IP对于网络隐私保…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

Shell之高效文本处理命令

目录 一、排序命令—sort 基本语法 常用选项 二、去重命令—uniq 基本语法 常用选项 三、替换命令—tr 基本语法&#xff1a; 常用选项 四、裁剪命令—cut 基本语法&#xff1a; 常用选项 字符串分片 五、拆分命令—split 基本语法&#xff1a; 六、 文件…

【if条件、for循环、数据框连接、表达矩阵画箱线图】

编程能力&#xff0c;就是解决问题的能力&#xff0c;也是变优秀的能力 From 生物技能树 R语言基础第七节 文章目录 1.长脚本管理方式if(F){....}分成多个脚本&#xff0c;每个脚本最后保存Rdata&#xff0c;下一个脚本开头清空再加载 2.实战项目的组织方式方法&#xff08;一&…

【微服务最全详解】

文章目录 微服务微服务的介绍微服务服务架构演变 微服务网关微服务的负载均衡微服务的容灾机制服务崩溃服务容灾机制微服务熔断机制微服务限流Sentinel怎么实现限流微服务限流算法1.令牌桶算法2.漏斗桶算法 服务监控日志收集 微服务 微服务的介绍 微服务是一种软件架构风格&a…

上班族兼职新篇章:10大实战攻略,轻松年赚1-20万

对于众多上班族而言&#xff0c;如何在工作之余赚取额外收入&#xff0c;开启自己的第一份副业&#xff0c;已成为许多人心中的疑问。每个人的才能和兴趣点不尽相同&#xff0c;但都有机会找到适合自己的兼职方式。接下来&#xff0c;就让我们一起探索这10大实战攻略&#xff0…

Google Ads谷歌广告账户被封停怎么办?

跨境出海业务少不了需要做Google Ads推广业务&#xff1b;其中让投手们闻风丧胆的消息就是帐户被暂停。当 Google 检测到任何违反其政策且可能损害用户在线体验的行为时&#xff0c;就会发生这种情况。那么如何在做广告推广的同时&#xff0c;保证账号不被封禁呢&#xff1f;看…

基于单片机的智能安防系统设计(32+4G+WIFI版)-设计说明书

设计摘要&#xff1a; 本设计基于STM32单片机&#xff0c;旨在实现一个智能安防系统&#xff0c;主要包括烟雾和温度传感器、人体红外传感器、显示屏、按键、4G模块和WiFi模块等组件。通过这些组件的协作&#xff0c;实现了火灾检测、入侵监测、状态显示、用户交互和远程通信等…

AI高清逼真换脸换装

在我们的最新AI换脸换装技术中&#xff0c;我们将高度真实的视觉效果与创新的人工智能技术相结合&#xff0c;提供了前所未有的个性化数字体验。无论是为了娱乐、广告、电影制作还是个人化虚拟体验&#xff0c;我们的技术都能让你的想象无缝转换为现实。通过我们的平台&#xf…

Linux命令使用

一、ls tree clear 1.1 ls ls&#xff1a;查看当前目录下的文件名ls 目录名&#xff1a;查看指定目录下的文件名ls /&#xff1a;查看根目录下的文件名ls -a&#xff1a;查看当前目录下的所有文件名&#xff0c;包括隐藏文件ls -l&#xff1a;查看当前目录下文件的详细信息…

Blender雕刻建模_笔刷纹理和顶点绘制

笔刷纹理 主要用于皮肤&#xff0c;纹理的雕刻。 可以修改映射方式来实现不同绘制效果。 用一张纹理来定义笔刷各个点的强度。其中白色为1&#xff0c;黑色为0。 设置笔刷纹理步骤&#xff1a; -新建一套笔刷 -强度&#xff0c;设为0.15&#xff08;可以根据需求修改&#x…

数据结构与算法笔记(一)---时间复杂度与空间复杂度

前言 以自述式的笔记展示&#xff0c;尽可能用最好理解的方式去叙述我对知识点的理解&#xff0c;方便有需求的小伙伴查看理解&#xff0c;同时锻炼自身的表达能力&#xff0c;共同学习&#xff0c;共同进步&#xff0c;争取“双赢”&#xff01; 注&#xff1a;本文章根据自…

Java面试八股之WeakHashMap的工作原理

简述WeakHashMap的工作原理 弱键&#xff08;Weak Keys&#xff09;&#xff1a; WeakHashMap 的键&#xff08;keys&#xff09;是通过 WeakReference 弱引用进行封装的。弱引用是一种特殊的引用类型&#xff0c;它不会阻止所引用的对象被垃圾收集器回收。这意味着&#xff…

机器人操作系统ROS2学习—控制小海龟运动

将Ubuntu系统和ROS2安装完成后&#xff0c;就可以进行调用小海龟运动了。 一、打开Ubuntu系统后&#xff0c;调用终端窗口。有3 种方法可以打开启动终端: 1、通过快捷键CtrAItT; 2、桌面左下角有个显示应用的菜单&#xff0c;点击后找到终端“Terminal”图标&#xff0c;打…

kubernetes二进制多master部署

文章目录 一、master02 节点部署&#xff08;在上期博客部署完成的情况下&#xff09;1、准备master02节点需要的文件2、修改配置文件kube-apiserver中的IP3、启动各服务并设置开机自启4、查看node节点状态 二、负载均衡部署1、配置load balancer集群双机热备负载均衡1.1 准备n…

英飞凌SiC模块为小米电动车提供动力

至2027年之际&#xff0c;SiC功率模块与裸片产品将荣耀登场&#xff0c;助力小米电动汽车新品SU7璀璨问世。英飞凌&#xff0c;这家业界翘楚&#xff0c;将倾其所能&#xff0c;为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块&#xff0c;如同给电动汽车的心脏注…