最大二叉搜索子树

本文介绍如何找到给定二叉树中最大的二叉搜索子树。通过分析最大搜索子树的两种情况,以及利用后序遍历策略,我们可以确定每个节点是否构成搜索二叉树。在遍历过程中,收集左子树和右子树的相关信息,根据这些信息判断并返回最大搜索子树的头节点。
摘要由CSDN通过智能技术生成

题目

给定一棵二叉树,返回该二叉树最大的二叉搜索子树

分析

以root为头的树中,最大的搜索二叉子树只能来自以下两种情况
1、来自root左子树上的最大搜索二叉子树是以root左孩子为头的,并且来自root右子树上的最大搜索二叉子树是以root右孩子为头的,root左子树上的最大搜索二叉子树的最大值小于root节点值,root右子树上的最大搜索二叉子树的最小值大于root的节点值,那么以结点root为头的整颗树都是搜索二叉树。
2、如果不满足第一种情况,说明一节点root为头的树整体不能连成搜索二叉树。这种情况下,以root为头的树上的最大搜索二叉子树是来自root的左子树上的最大搜索二叉子树和来自root的右子树上的最大搜索二叉子树之间,节点数较多的那个。

思路

1、整体过程是二叉树的后序遍历
2、遍历到当前结点记为cur,先遍历cur的左子树并收集4个信息,分别是左子树上最大搜索二叉子树的头节点、结点数、树上的最小值和树上的最大值。再遍历cur的右子树收集4个信息,分别是右子树上最大搜索二叉子树的头节点、结点数、最小值、最大值。
3、根据步骤二收集的信息,判断是否满足以cur为头的结点整体是二叉搜索树。如果满足,就返回cur结点;如果不满足,就返回左子树和右子树各自的最大搜索二叉树中节点数较多的那个树的头节点。
4、对于整个遍历过程,可以使用全局变量更新的方式实现返回节点cur的四个信息

代码实现

private class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值