java 子节点查找父节点_03-并查集应用-二叉树任意两节点寻找最近祖先-子矩阵最大累加和...

这篇博客探讨了如何使用并查集解决二叉树中任意两节点的最近公共祖先问题,以及寻找子矩阵最大累加和的算法。通过实例解析了并查集在解决这些问题上的应用,并提出了高效处理方法,要求在限定的时间复杂度内完成。
摘要由CSDN通过智能技术生成

年轻即出发...

简书:https://www.jianshu.com/u/7110a2ba6f9e

知乎:https://www.zhihu.com/people/zqtao23/posts

GitHub源码:https://github.com/zqtao2332

个人网站:http://www.zqtaotao.cn/ (停止维护更新内容)

QQ交流群:606939954

咆哮怪兽一枚...嗷嗷嗷...趁你现在还有时间,尽你自己最大的努力。努力做成你最想做的那件事,成为你最想成为的那种人,过着你最想过的那种生活。也许我们始终都只是一个小人物,但这并不妨碍我们选择用什么样的方式活下去,这个世界永远比你想的要更精彩。

最后:喜欢编程,对生活充满激情



本节内容预告

实例1:岛问题和并查集

实例2:并查集应用-二叉树任意两节点寻找最近祖先

实例3:子矩阵最大累加和



实例1:岛问题和并查集

岛问题和并查集的基本知识,已经在简书中记录过。

原文:https://www.jianshu.com/p/98ceadaf039a

实例2:并查集应用-二叉树任意两节点寻找最近祖先

如下的Node类是标准的二叉树节点结构:

public static class Node {
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value = data;
        }
    }

再定义Query类如下:

public static class Query {
        public Node o1;
        public Node o2;

        public Query(Node o1, Node o2) {
            this.o1 = o1;
            this.o2 = o2;
        }
    }

一个Query类的实例表示一条查询语句,表示想要查询01节点和02节点的最近公共祖先节点.

给定一棵二叉树的头节点head,并给定所有的查询语句,即一个Query类型的数组 Queryl ques,

请返回Node类型的数组Node[] ans,

ans[j]代表ques[j]这条查询的答案,即 ques[i].01和ques[j].02的最近公共祖先

【要求】

如果二叉树的节点数为N,查询语句的条数为M,整个处理过程的时间复杂度要求达到O(N+M).

1、将所有的请求都存储进哈希表,同时存储进每一个请求的反请求。

另外一个indexMap 来存储请求和反请求对应的是第几个请求

一个请求 (4,9) 
同时在哈希表中存进这个请求和反请求
(4,9)     (9,4)

再看indexMap
假设有:(2,3)  (5,1)  (4,9)  (7,2)

只有是同一个请求,无论是反请求还是原请求,都记录相同的index,如(4,9) ,存的都是2号请求。


这是一个二叉树,当遍历大4 的时候,9还未出现,那么就暂时放弃(4,9)请求,等遍历到9时进行(9,4)的请求。

2、排除一些可以直接给定查询答案的query

if (o1 == o2 || o1 == null || o2 == null) {
        ans[i] = o1 != null ? o1 : o2;
  }

  query的o1 或者 o2 为空,或者都为空处理

3、并查集处理祖先

6d403724a2f95a010afd3e562a55c308.png
import java.util.HashMap;
import java.util.LinkedList;

/**
 * @description: 并查集应用-二叉树任意两个节点寻找最近祖先
 */
public class Code_08_TarjanAndUnionSet
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值