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

news2024/11/15 2:00:23

二叉排序树:

代码:

#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:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop3:HDFS副本节点选择逻辑讲解

一、副本节点选择&#xff08;机架感知&#xff09; 说明 第一个副本&#xff0c;因为我们的client可能是web页&#xff0c;也可能是shell终端。 如果是web页&#xff0c;则随机选取一个节点&#xff0c;如果是shell终端&#xff0c;则选择当前shell终端所在的节点。 节点距离最…

TiDB学习2:TiDB Sever

目录 1. TiDB Server架构 2. sql语句的解析和编译 2.1 Parse ​编辑 2.2 compile 3. 行转化为KV对(聚簇表) ​编辑4. SQL 读写相关模块 4.1 DistSQL(复杂查询) 4.2 KV(简单查询) 5. 在线DDL相关模块 6. GC机制与相关模块 7. TiDB Server的缓存 8. 热点小表缓存 9. …

财富增长新途径:副业赚钱方法全攻略

探寻财富之路:多元化赚钱途径解析 在追求财富的道路上,每个人都在以自己的方式前行。然而,正如古人所云:“君子爱财,取之有道。”今天,我将为您揭示一些新颖且实用的赚钱途径,希望能为您的财富积累之路注入新的活力。 1、视频内容的创作与分享 在这个视频内容为王的时…

Benedict Evans:Ways to think about AGI思考 AGI 的方法:

​Benedict Evans本文发布于2024 年 5 月 4 日 How do we think about a fundamentally unknown and unknowable risk, when the experts agree only that they have no idea? 当专家们一致认为他们一无所知时&#xff0c;我们如何看待根本上未知和不可知的风险&#xff1f; T…

关于 vs2019 c++20 规范里的 STL 库里模板 decay_t<T>

&#xff08;1&#xff09; 这个模板&#xff0c;在库代码里非常常见。 decay 英文是“衰弱&#xff0c;消减” 的意思&#xff0c;大概能感觉到就是要简化模板参数 T 的类型&#xff0c;去掉其上的修饰符。因为常用且复杂&#xff0c;故单独列出其源码和注释。先举例其应用场景…

JumpServer堡垒机应用(v3.10.8) 下

目录 JumpServer堡垒机简单式部署与管理(v3.10.8) 上-CSDN博客 一. 资产管理 1.1创建资产 1.2 给资产主机创建用户 1.2.1 普通账户&#xff1a; 1.2.2 特权账户&#xff1a; 1.2.3 创建用户 二. 命令过滤 2.1 创建命令组 2.2 创建命令过滤 ​编辑 三. 创建资产授权 …

《Python编程从入门到实践》day29

# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…

软考中级-软件设计师 (十一)标准化和软件知识产权基础知识

一、标准化基础知识 1.1标准的分类 根据适用的范围分类&#xff1a; 国际标准指国际化标准组织&#xff08;ISO&#xff09;、国际电工委员会&#xff08;IEC&#xff09;所制定的标准&#xff0c;以及ISO所收录的其他国际组织制定的标准。 国家标准&#xff1a;中华人民共和…

单位个人如何向期刊投稿发表文章?

在单位担任信息宣传员一职以来,我深感肩上的责任重大。每月的对外信息宣传投稿不仅是工作的核心,更是衡量我们部门成效的重要指标。起初,我满腔热血,以为只要勤勉努力,将精心撰写的稿件投至各大报社、报纸期刊的官方邮箱,就能顺利登上版面,赢得读者的青睐。然而,现实远比理想骨…

Polylang Pro插件下载:多语言网站构建的终极解决方案

在全球化的今天&#xff0c;多语言网站已成为企业拓展国际市场的重要工具。然而&#xff0c;创建和管理一个多语言网站并非易事。幸运的是&#xff0c;Polylang Pro插件的出现&#xff0c;为WordPress用户提供了一个强大的多语言解决方案。本文将深入探讨Polylang Pro插件的功能…

基于物联网的教室人数检测系统-设计说明书

设计摘要&#xff1a; 本设计基于物联网技术&#xff0c;实现了一个教室人数检测系统。系统利用STM32单片机作为中控&#xff0c;通过红外对管检测人员进出教室&#xff0c;并实时统计应到人数和实到人数&#xff0c;同时使用OLED显示屏显示相关信息。系统还通过温湿度传感器检…

用SwitchHosts模拟本地域名解析访问

一.用SwitchHosts模拟本地域名解析访问 1.下载地址 https://download.csdn.net/download/jinhuding/89313168 2.使用截图

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

【动态规划五】回文串问题

目录 leetcode题目 一、回文子串 二、最长回文子串 三、分割回文串 IV 四、分割回文串 II 五、最长回文子序列 六、让字符串成为回文串的最少插入次数 leetcode题目 一、回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/…

mysql的explain

explain可以用于select&#xff0c;delete&#xff0c;insert&#xff0c;update的statement。 当explain用于statement时&#xff0c;mysql将会给出其优化器&#xff08;optimizer&#xff09;的执行计划。 通过explain字段生成执行计划表。下面来解析这个执行计划表的每一列…

一种请求头引起的跨域问题记录(statusCode = 400/CORS)

问题表象 问题描述 当我们需要在接口的headers中添加一个自定义的变量的时候&#xff0c;前端的处理是直接在拦截器或者是接口配置的地方直接进行写&#xff0c;比如下面的这段比较基础的写法&#xff1a; $http({method: "post",url:constants.backend.SERVER_LOGIN…

Cache基本原理--以TC3xx为例(2)

目录 1.概述 2. Cache映射模式 3.DCache的数据一致性 4.小结 1.概述 上一篇Cache基本原理--以TC3xx为例(1)-CSDN博客&#xff0c;我们聊了Cache基本概念&#xff0c;接下来我们将继续聊Cache映射模式&#xff0c;DCache的数据一致性问题。 2. Cache映射模式 常见的Cache地…

Postman基础功能-前置脚本与接口关联

大家好&#xff0c;今天给大家分享一下关于 Postman 工具中的前置脚本与接口关联的使用&#xff0c;本文中汇大量用到关于变量的知识&#xff0c;前段时间给大家除了一篇文章分享&#xff0c;可以参考&#xff1a; Postman基础功能-变量设置与使用 一、前置脚本 介绍&#xf…

C++笔试强训day23

目录 1.打怪 2.字符串分类 3.城市群数量 1.打怪 链接 模拟题目&#xff0c;按题意进行模拟就行。 #include <iostream> using namespace std; // 简单模拟 int solve() {int h, a, H, A;cin >> h >> a >> H >> A;if (a > H)return -1;int…

bcb6 lib编程

Library 新建 Library 新建Cpp File File1.cpp extern "C" __declspec(dllexport) int add(int a,int b) {return ab;}Build Project->Build Project1 使用 新建项目 Add New Project Unit1.cpp #pragma hdrstop#include "Unit1.h" //---------…