剑指offer之求二叉树中两个节点的最低共同父节点

1 问题

求二叉树中俩个节点的最低共同父节点,比如二叉树如下

                42         61     3   5     7 

  比如节点1和3两个节点的最低共同父节点是2,节点3和5两个节点的最低共同父节点是4,节点5和6两个节点的最低共同父节点是6,

  也有可能其中1个节点或者2个节点不在二叉树里面,那么他们就没有最低共同父节点。

 

 

 

 

 

2 分析

                42         61     3   5     7 

比如我们求节点1和3两个节点的最低共同父节点,我们保存每个根节点到该节点的最短路径节点值,比如节点1的路径就是4->2->1 然后节点3的路径是4->2->3,然后我们再把这个保存的2个路径依次从尾巴进行进行比较,然后就能获取两个节点的最低共同父节点值。

 

 

 

 

 

3 代码实现

#include <iostream>
#include <vector>
#include <stdlib.h>using namespace std;typedef struct Tree
{int value;struct Tree* left;struct Tree* right;Tree(int value) : value(value), left(NULL), right(NULL) {}
} Tree;class CommonParentNode
{
public:bool hasPath(Tree* head, Tree* node, std::vector<Tree *>& vector){if (head == NULL)return false;///先把我们的遍历节点保存到vector里面去vector.push_back(head);if (head == node)return true;//如果这样写只能说明子递归return值了,但是这个函数没有返回值。if (head->left != NULL && hasPath(head->left, node, vector))return true;if (head->right != NULL && hasPath(head->right, node, vector))return true;//这里一定要调用pop_back函数,如果这个节点的左右子节点都为空或者左子树或者右子树里面不包含这个我们的节点,//这个节点就要弹出来,如果没有这个函数,那么我们的vector里面保存的先序遍历到这个节点的所有节点值,//而不是根节点到这个节点的最短距离。vector.pop_back();return false;}Tree* getCommmonParent(Tree* node, Tree* node1, Tree* node2){if (node == NULL || node1 == NULL || node2 == NULL){std::cout << "node == NULL || node1 == NULL || node2 == NULL" << std::endl;return NULL;}vector<Tree *> vector1;vector<Tree *> vector2;bool result1 = hasPath(node, node1, vector1);if (!result1)return NULL;bool result2 = hasPath(node, node2, vector2);if (!result2)return NULL;//我们vector依次保存的是从头结点到该节点的路径,我们遍历的时候应该从vector的尾巴开始遍历,注释的遍历错了,要注意// for (int i = 0; i < vector1.size(); ++i)// {//     for (int j = 0; j < vector2.size(); ++j)//     {//         //if (vector1[i]->value == vector2[j]->value)//         if (vector1[i] == vector2[j])//         {//             std::cout << "common parent node value is" << vector1[i]->value << std::endl;//             return vector1[i];//         }//     }// } for (int i = vector1.size() - 1; i >= 0; --i){for (int j = vector2.size() - 1; j >= 0; --j){//if (vector1[i]->value == vector2[j]->value)if (vector1[i] == vector2[j]){return vector1[i];}}} return NULL; }
};int main() {Tree *node1 , *node2 , *node3, *node4, *node5, *node6, *node7, *node8;node1 = (Tree *)malloc(sizeof(Tree));node2 = (Tree *)malloc(sizeof(Tree));node3 = (Tree *)malloc(sizeof(Tree));node4 = (Tree *)malloc(sizeof(Tree));node5 = (Tree *)malloc(sizeof(Tree));node6 = (Tree *)malloc(sizeof(Tree));node7 = (Tree *)malloc(sizeof(Tree)); node8 = (Tree *)malloc(sizeof(Tree)); node1->value = 4;node2->value = 2;node3->value = 6;node4->value = 1;node5->value = 3;node6->value = 5;node7->value = 7;node8->value = 8;node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node4->left = NULL;node4->right = NULL;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;node7->left = NULL;node7->right = NULL;/*** 42         61     3   5      7     **/CommonParentNode commonParentNode;Tree *commonTreeNode = NULL;commonTreeNode = commonParentNode.getCommmonParent(node1, node5, node7);if (!commonTreeNode){std::cout << "the two node do not find commonTreeNode" << std::endl;return -1;}std::cout << "commonTreeNode parent node value is " << commonTreeNode->value << std::endl;return 0;
}

 

 

 

 

 

4 运行结果

commonTreeNode parent node value is 4

 

 

 

 

5 总结

这个题目的思路是保存根节点到每个节点中途最短路径父节点值,然后进行比较,同时我们应该可以知道求根节点到该节点最短路径的每个节点值,就是vector里面保存的每个节点,同时也知道根节点到该节点的高度值,也就是这个vecter里面保存数据的大小,既vector.size()函数的值,代码和上面部分代码一样。

bool hasPath(Tree* head, Tree* node, std::vector<Tree *>& vector){if (head == NULL)return false;///先把我们的遍历节点保存到vector里面去vector.push_back(head);if (head == node)return true;//如果这样写只能说明子递归return值了,但是这个函数没有返回值。if (head->left != NULL && hasPath(head->left, node, vector))return true;if (head->right != NULL && hasPath(head->right, node, vector))return true;//这里一定要调用pop_back函数,如果这个节点的左右子节点都为空或者左子树或者右子树里面不包含这个我们的节点,//这个节点就要弹出来,如果没有这个函数,那么我们的vector里面保存的先序遍历到这个节点的所有节点值,//而不是根节点到这个节点的最短距离。vector.pop_back();return false;}

很经典的代码。

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

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

相关文章

C#语法糖系列 —— 第四篇:聊聊 Span 的底层玩法

把 Span 归于语法糖&#xff0c;可能有些偏了&#xff0c;但偏了就偏了&#xff0c;哈哈&#xff0c;只要是分享就好&#xff0c;C# 发展至今&#xff0c;已经是一门非常重的语言了&#xff0c;所有想要的它都要&#xff0c;即可以&#xff1a;面向过程编程面向对象编程面向函数…

hdu 1556 Color the ball 线段树 区间更新

水一下 #include <bits/stdc.h> #define lson l, m, rt<<1 #define rson m1, r, rt<<1|1 using namespace std;const int MAXN 111111; int sum[MAXN<<2]; int n;void push_down(int rt, int len) {if(sum[rt] 0) return;sum[rt<<1] sum[rt];…

【ArcGIS风暴】河流水系左斜体样式经典设置方法

目录 一、效果预览 二、实现方法 一、效果预览 河流水系在作图时一般设置为左斜体、蓝色,如黄河、青海湖、洮河等,如下图所示: 二、实现方法 下面介绍在ArcGIS 10.5中的实现方法。 1、ArcGIS设置方法 绘图工具添加文字或者将标注转为注记,双击,打开属性,点击更改符号…

mlp 参数调优_积神经网络(CNN)的参数优化方法

积神经网络(CNN)的参数优化方法from&#xff1a;http://blog.csdn.net/u010900574/article/details/51992156著名&#xff1a; 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录&#xff0c;并…

HBase简介(很好的梳理资料)

HBase HBaseHadoop网络应用数据结构NoSQL 一、 简介 history started by chad walters and jim 2006.11 G release paper on BigTable 2007.2 inital HBase prototype created as Hadoop contrib 2007.10 First useable Hbase 2008.1 Hadoop become Apache top-level project …

python 实现原型设计模式

原型设计模式主要在当新建一个对象的时候&#xff0c;觉得很麻烦&#xff0c;并且你又要保留当前对象。在这种情况下使用原型设计模式是一个很好的解决办法。 例如你写一个东西更新&#xff0c;不同的版本&#xff0c;这个时候以前的版本肯定要保留&#xff0c;并且从此基础上…

装服务器显示磁盘脱机,服务器磁盘处于脱机

服务器磁盘处于脱机 内容精选换一换配置目的端或启动目的端时提示“SMS.1311 目的端磁盘个数不够”。在配置目的端服务器过程中&#xff0c;会校验目的端磁盘数量是否和源端一致。当出现该错误时&#xff0c;检查目的端服务器磁盘数量是否少于源端服务器磁盘数量&#xff0c;或…

百度第三方登录

首先第三方应用要跟微信帐号合作&#xff0c;然后按照下面的方法操作&#xff1a; 目前&#xff0c;百度OAuth2.0支持五种获取Access Token的流程和一种刷新获取AccessToken方式&#xff0c;第三方可根据需求选取合适的方式&#xff1a; 百度授权的Access Token是有有效期的&am…

剑指offer之重建二叉树

1 问题 重建二叉树&#xff1a;给定二叉树的先序遍历&#xff08;根左右&#xff09;和中序&#xff08;左中右&#xff09;遍历结果&#xff0c;建立这棵二叉树。输入保证二叉树无重复结点 以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例 2 分析 先序遍…

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时&#xff0c;第一映像会说AOP的应用层面&#xff0c;比如拦截器、过滤器&#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的&#xff0c;AOP是思想&#xff0c;面向切面思想。既然是编程思想&#xff0c;那我们就有必要了…

Ubuntu系统备份工具大全(官方整理推荐)

其实官方在系统备份这块已经有Wiki整理和收集各类实用的工具。以下是翻译自官方Wiki的部分文档&#xff1a; 备份工具 wiki文档实用程序 工具 界面 格式类型 Raw/File 支持 远程 增量 差异 自动化 Dj Dup 图形&#xff08;集成到系统工具&#xff09; File 是 是 …

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码&#xff0c;或者某些接口不方便改动的时候&#xff0c;使用一个特定的封装&#xff0c;一些特定的编写办法&#xff0c;使不同的接口可以使用同种调用方式使用。 更简单的说话则是&#xff0c;例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

cocos2d-x 3.0rc2中读取sqlite文件

cocos2d-x 3.0rc2中读取sqlite文件的方式&#xff0c;在Android中直接读取软件内的会失败。须要复制到可写的路径下 sqlite3* dbFile NULL;std::string path;path FileUtils::getInstance()->fullPathForFilename("db1.db");#if CC_TARGET_PLATFORM CC_PLATFOR…

hse不起振 stm8_STM8S207使用外部24M晶振不起振的解决办法

具体表现&#xff1a;1、使用 20M 的外部晶振&#xff0c;程序也能正常工作。2、使用 24M 的外部晶振&#xff0c;就不能工作&#xff0c;经示波器测量&#xff0c;晶振没有起振。3、为了去除晶振的原因&#xff0c;就换了一个 24M 的晶振&#xff0c;结果还是不行&#xff0c;…

剑指offer之数组出现次数超过一半的数字

1 问题 数组中有一个数字出现了次数超过数组长度的一半&#xff0c;请找出这个数字。 比如{1,2,3,2,2,2,5,4,2},我们知道这个数是2 2 分析 我们数组元素个数分为单数和双数 1&#xff09;数组长度是单数的情况下 我们有5个元素&#xff0c;里面至少3个2&#xff0c;还有2个…

C#多线程调试

概要这篇文章主要分享多线程部分调试技巧&#xff0c;在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微…

最速下降法(梯度下降法)

最速下降法的影子在机器学习中正是无处不在&#xff0c;它简单实用。 一、表示 在最速下降法中&#xff0c;对权值向量w的连续调整是在最速下降的方向上&#xff0c;即它是与梯度向量方向相反的&#xff0c;梯度向量记为&#xff08;1&#xff09;&#xff0c;简记&#xff08;…

游戏服务器销售额,游戏服务器销售一个月

游戏服务器销售一个月 内容精选换一换应用容器化改造有三种方式&#xff0c;您可单击这里查看。本教程以某游戏为例&#xff0c;将该游戏进行微服务的架构改造&#xff0c;再进行容器化。本教程不对改造细节做深度讲解&#xff0c;仅讲解大致的建议。如需要详细了解容器化改造的…