二叉树10:最大二叉搜索子树

这是一篇关于如何在二叉树中寻找节点数量最多的最大二叉搜索子树的文章。通过递归方法,利用全局变量传递信息,解决复杂业务逻辑。在递归过程中,分别计算子树的最大值、最小值和节点数量,根据特定条件确定最大搜索子树的根节点。
摘要由CSDN通过智能技术生成

题目:有一棵二叉树,其中所有节点的值都不一样,找到含有节点最多 的搜索二叉子树,并返回这棵子树的头节点.给定二叉树的头结点root,请返回所求的头结点,若出现多个节点最多的子树,返回头结点权值最大的。

思路:这道题目很好也很难,难点主要是对递归的考察,要好好理解,多次理解。之前的递归比较简单,例如单纯使用递归对二叉树进行先序、中序、后序遍历时每一次递归调用只是进行一些操作(将当前遍历的结点放入到list中),并不需要收集信息并不需要向上一级返回信息,因此很简单;之后在Tree9题目中每次递归调用时需要得到2个信息(该子树的最大长度,该子树的高度)并将这2个信息组成数组进行返回,因此每次递归调用时先接收上次调用返回的数组,然后进行处理,处理完的结果放入到一个新的数组中再返回这个数组,注意,Tree9中需要收集返回的2个信息都是int类型的,因此可以形成int[]数组进行返回;本题中由于业务逻辑更加复杂,每一次递归调用时需要利用的信息有4个,同时递归方法执行结束后返回的信息也有4个(当前子树的最大二叉搜索子树的根结点TreeNode,最大搜索子树的结点数目int,当前子树的最小值int,当前子树的最大值int)由于这4个信息不是同一类型的,因此不能组成一个数组进行返回(当然也可以组成一个map进行返回,map允许放入不同类型的数据),因此需要换种策略,其实思路什么的完全相同,只是实现策略上稍微有些变化而已。对于TreeNode的信息,依然可以直接返回,即令该递归函数的返回值是TreeNode,对于其他的3个int类型的参数,使用全局变量数组引用传递的方式来进行传递,即在调用递归方法时,除了传入根结点root之外,还要传入一个空的int[]数组,用来存放本方法处理后的结果,在方法的处理过程中,分别将计算得到的结果:最大搜索子树的结点数目、子树最小值、子树最大值分别放入到这个数组的tempRes[0],tempRes[1],tempRes[2]中,不需要显式地返回这个数组,只要将这个res[]定义为递归方法外的成员变量,那么在本方法对res[]数组进行赋值之后,这些值会自动保留,于是在本次递归方法执行结束返回后,在上一层递归方法中通过访问成员变量res[]就可以得到上一次递归方法执行后的结果。

TreeNodelnode=postOrder(root.left,res);

intlmax=res[0];

intlmin=res[1];

intlnum=res[2];

TreeNodernode= postOrder(root.right,res);

intrmax=res[0];

intrmin=res[1];

intrnum=res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值