2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。
2022-03-19:已知一棵二叉树上所有的值都不一样,
给定这棵二叉树的头节点head,
给定一个整型数组arr,arr里放着不同的值,每个值一定在树上
返回数组里所有值的最低公共祖先。
答案2022-03-19:
递归。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
root := &TreeNode{val: 1}
root.left = &TreeNode{val: 2}
root.right = &TreeNode{val: 3}
root.left.left = &TreeNode{val: 4}
root.left.right = &TreeNode{val: 5}
root.right.left = &TreeNode{val: 6}
root.right.right = &TreeNode{val: 7}
ret := lowestCommonAncestor(root, []*TreeNode{root.left.left, root.right.right, root.right.left})
fmt.Println(ret.val)
}
type TreeNode struct {
val int
left *TreeNode
right *TreeNode
}
func lowestCommonAncestor(root *TreeNode, nodes []*TreeNode) *TreeNode {
set := make(map[int]struct{})
for _, node := range nodes {
set[node.val] = struct{}{}
}
return process(root, set, len(set)).find
}
type Info struct {
// 找没找到最低公共祖先
// 没找到,find = null
// 找到了最低公共祖先,find是最低公共祖先
find *TreeNode
// 我这颗子树上,删掉了几个节点!
removes int
}
func NewInfo(f *TreeNode, r int) *Info {
ans := &Info{}
ans.find = f
ans.removes = r
return ans
}
func process(x *TreeNode, set map[int]struct{}, all int) *Info {
if x == nil {
return NewInfo(nil, 0)
}
left := process(x.left, set, all)
if left.find != nil {
return left
}
right := process(x.right, set, all)
if right.find != nil {
return right
}
cur := 0
if _, ok := set[x.val]; ok {
cur = 1
}
delete(set, x.val)
if left.removes+right.removes+cur == all {
return NewInfo(x, all)
} else {
return NewInfo(nil, left.removes+right.removes+cur)
}
}
执行结果如下:

2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。的更多相关文章
- 寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)
转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: ——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左 ...
- 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50
前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...
- 编程算法 - 二叉树的最低公共祖先 代码(C)
二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍 ...
- 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)
1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...
- layui页面操作,点击一个添加页面,跳转有确定,然后点击确定后将选择的几个数据返回前一个页面获取值,然后ajax请求后台
custUserIndex.html [添加页面代码] <!DOCTYPE html> <html> <head> <meta charset="u ...
- 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?
在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...
- 第一节 Python基础之数据类型(整型,布尔值,字符串)
数据类型是每一种语言的基础,就比如说一支笔,它的墨有可能是红色,有可能是黑色,也有可能是黄色等等,这不同的颜色就会被人用在不同的场景.Python中的数据类型也是一样,比如说我们要描述一个人的年龄:小 ...
- daimayuan第二课(1.二叉树的遍历,2.二叉树的最近公共祖先,3.二叉搜索树)
二叉树的最近公共祖先: 1:概念:就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵树上距离最近的公共祖先节点. 2:因为是基础课,所以tarjan和倍增lca就留到中级课再 ...
- 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)
寻找最近公共祖先,示例如下: 1 / \ 2 3 / \ / \ 4 5 6 7 / \ ...
- [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...
随机推荐
- NDVI批量处理排除值-3000
代码如下: import arcpy from arcpy import env from arcpy.sa import * import sys reload(sys) sys.setdefaul ...
- GaussDB(DWS)运维:导致SQL执行不下推的改写方案
摘要:本文就针对因USING子句的书写方式可能导致MERGE INTO语句的执行不下推的场景,对USING子句的SQL语句进行改写一遍,整个SQL语句可以下推. 本文分享自华为云社区<Gauss ...
- PyQt5学习 (1)--对象的基本操作、QObject
参考视频:[Python-GUI编程-PyQt5 (少)] https://www.bilibili.com/video/BV17J41177ro/?share_source=copy_web& ...
- Python 霸榜的一周,又有什么新 AI 力作呢?「GitHub 热点速览」
GPT 带火了一波语言模型,LLaMA 和 Alpaca 也在持续发力.依旧是各类 GPT 后缀霸榜 GitHub trending 的一周,为此特推部分专门收录了两个比较不错的 GPT 应用.而作为 ...
- ECC(SM2) 简介及 C# 和 js 实现【加密知多少系列】
〇.简介 椭圆曲线密码学(Elliptic curve cryptography:ECC),一种建立公开密钥加密的演算法,基于椭圆曲线数学.利用有限域上椭圆曲线的点构成的 Abel 群离散对数难解性, ...
- 逍遥自在学C语言 | 逻辑运算符
前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 ...
- python模拟鼠标键盘操作
前言 1 懒人,工作中可以模拟真人操作,不用自己点击 2游戏人员 这是做模拟外挂的必备知识,不管手机还是电脑游戏,尤其副本 准备模块 代码如下: 实现了一个最简单的输入密码,enter进入的登录过程 ...
- 虚拟内存与malloc/new原理详解
malloc malloc()函数并不是系统调用,而是 C 库里的函数,用于动态分配内存.malloc() 分配的是虚拟内存,而不是物理内存.如果分配后的虚拟内存没有被访问的话,是不会将虚拟内存映射到 ...
- Scanner对象的用法
Java流程控制 想要实现程序与人的交互,我们必须使用Java给我们提供的工具类.就像我最开始写的一篇博客,用Java提供给我们的一个机器人类Robot是控制鼠标键盘的.今天我们学习的是一个可以获取用 ...
- 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)
单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...