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

本文主要是介绍设计非递归算法,编程:在二叉排序树中,打印关键码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 小于 bif (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, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993221

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

Java实现预览与打印功能详解

《Java实现预览与打印功能详解》在Java中,打印功能主要依赖java.awt.print包,该包提供了与打印相关的一些关键类,比如PrinterJob和PageFormat,它们构成... 目录Java 打印系统概述打印预览与设置使用 PageFormat 和 PrinterJob 类设置页面格式与纸张