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)
}
}

执行结果如下:


左神java代码

2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。的更多相关文章

  1. 寻找二叉树中的最低公共祖先结点----LCA(Lowest Common Ancestor )问题(递归)

    转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: ——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左 ...

  2. 二叉树系列 - 求两节点的最低公共祖先,例 剑指Offer 50

    前言 本篇是对二叉树系列中求最低公共祖先类题目的讨论. 题目 对于给定二叉树,输入两个树节点,求它们的最低公共祖先. 思考:这其实并不单单是一道题目,解题的过程中,要先弄清楚这棵二叉树有没有一些特殊的 ...

  3. 编程算法 - 二叉树的最低公共祖先 代码(C)

    二叉树的最低公共祖先 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉树的最低公共祖先(lowest common ancestor), 首先先序遍 ...

  4. 已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

    1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列 ...

  5. layui页面操作,点击一个添加页面,跳转有确定,然后点击确定后将选择的几个数据返回前一个页面获取值,然后ajax请求后台

    custUserIndex.html [添加页面代码] <!DOCTYPE html> <html> <head> <meta charset="u ...

  6. 为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  7. 第一节 Python基础之数据类型(整型,布尔值,字符串)

    数据类型是每一种语言的基础,就比如说一支笔,它的墨有可能是红色,有可能是黑色,也有可能是黄色等等,这不同的颜色就会被人用在不同的场景.Python中的数据类型也是一样,比如说我们要描述一个人的年龄:小 ...

  8. daimayuan第二课(1.二叉树的遍历,2.二叉树的最近公共祖先,3.二叉搜索树)

    二叉树的最近公共祖先: 1:概念:就是两个节点在这棵树上深度最大的公共的祖先节点. 换句话说,就是两个点在这棵树上距离最近的公共祖先节点. 2:因为是基础课,所以tarjan和倍增lca就留到中级课再 ...

  9. 【Leetcode】查找二叉树中任意结点的最近公共祖先(LCA问题)

    寻找最近公共祖先,示例如下: 1 /           \ 2           3 /    \        /    \ 4    5      6    7 /    \          ...

  10. [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)

    题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...

随机推荐

  1. scala apply方法和update方法

    示例代码1 class TestApplyClass { def apply(param: String): String = { println("apply method called, ...

  2. IBM 双队列管理器,双向传输

    1. 建立队列管理器 建立[test01][test02]两个队列管理器,一直下一步即可,端口号不能一致(需要记住设置的端口号,后面会用到) [test01]端口号 1414 [test02]端口号 ...

  3. spring boot 上传文件大小超出限制

    查看源码如下: org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration 可以看见调用了Multipa ...

  4. Python练习-3.12

    1.给文章中的手机号打上马赛克 也就是在文章中发现手机号之后,用*或者#等这一类无法将手机号直接识别出来的符号代替 # 文章中手机号的马赛克形式化 import re content="白日 ...

  5. 安装node.js教程------深入使用Vue

    教程 1.下载nodejs引擎 网址:https://nodejs.org/en/download/ 选择32-bit或者64-bit都行 2.下载最新版npm.zip压缩包 网址:http://no ...

  6. ZOJ 3735 Josephina and RPG (概率dp)

    题意:给你一个n,然后给你C(n,3)个队伍, 给你每个队伍之间的胜率. 接下来给你m个队伍,让你依次跟他们比赛,开始你能选择任意的队伍,如果你打赢了一支队伍,你可以选择换成输给你的这个队伍或者不换, ...

  7. 自己动手从零写桌面操作系统GrapeOS系列教程——17.用汇编语言清空屏幕

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 在QEMU中会默认输出一些字符,有时候会干扰我们自己输出的字符.一个比较好的办法是向将屏幕清空,再输出我们想要输出的字符.下面就来学习如何清空屏 ...

  8. CROS跨域问题的解决

    转载: 作者:小丞同学链接:https://www.zhihu.com/question/452543297/answer/2247177767来源:知乎 在前后端交互的过程中,经常会遇到跨域的问题, ...

  9. 发布新版博客备份功能:生成 sqlite 数据库文件,vscode 插件可查看

    大家好,最近我们重新开发了园子的博客备份功能,今天发布第一个预览版,欢迎大家试用. 点击博客后台侧边栏的博客备份进入新版博客备份: 点击创建备份按钮创建博客备份任务(目前每天只能创建一次备份),待备份 ...

  10. JVM加载中初始化时机?什么时候不会进行初始化?

    初始化的过程是给静态变量赋予指定值以及执行静态代码块的过程. 当遇到new,getstatic,putstatic,invokestatic指令时要进行初始化,也就是new实例化对象,调用静态变量以及 ...