设计非递归算法,编程:在二叉排序树中,打印关键码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

相关文章

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python中lambda排序的六种方法

《Python中lambda排序的六种方法》本文主要介绍了Python中使用lambda函数进行排序的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1.对单个变量进行排序2. 对多个变量进行排序3. 降序排列4. 单独降序1.对单个变量进行排序

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]