左神面试算法整理--二叉搜索数最大拓扑结构

算法思想:

建立一个拓扑贡献记录,每个节点左右两侧的值为对于某个节点,此节点拓扑贡献数,如下图:

从图中可以看出,所有的叶子节点对于5来说,他左右两边对5的拓扑贡献均为0,因为他左右两边没有节点。

a图中,在3处来说,对于5来说2符合二叉搜索树的条件,所以他贡献一个,同理4也贡献一个,所以3左右两边各一个。3节点自身也贡献一个,对于5来说左边的节点贡献了3个。右边同理。

图b,12,7大于5,8大于6不满足二叉搜索树条件,所以不能要,也就是不贡献.

那么我们只需要找到某节点,它的左右贡献值最大,那么它就是最大拓扑结构的头结点,左+右+1就是最大值



若在对于以b为头结点的最大子串上加上一个a,让他以a为头结点,若b<a,因为c(c代表b的左子串,不止一个)<b,那么c所代表的左孩子都小于a,满足搜索二叉树条件,所以c对b的贡献可以变成对a的贡献。

对于b的右孩子,若f是大于a的,那么f的贡献就要去除,对于小于a的节点的左孩子也是小于a的,贡献可以直接加上。

JAVA代码:

package chapter_3_binarytreeproblem;


import java.util.HashMap;
import java.util.Map;


public class Problem_08_BiggestBSTTopologyInTree {


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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值