nowcoder 最大二叉搜索子树

题目

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

思路

递归。分别找到一个节点左子树和右子树的搜索二叉子树的头节点。

代码

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class MaxSubtree:
    def getNode(self, root):
        if root.left:
            lnode, lcount, lMaxNum, lMinNum = self.getNode(root.left)
        else:
            lnode, lcount, lMaxNum, lMinNum = None, 0, 0, 0
        if root.right:
            rnode, rcount, rMaxNum, rMinNum = self.getNode(root.right)
        else:
            rnode, rcount, rMaxNum, rMinNum = None, 0, 0, 0
        if lMaxNum < root.val and root.val < rMinNum and lnode == root.left and rnode == root.right:
            return root, lcount + rcount + 1, rMaxNum, lMinNum
        else:
            if lcount == 0 and rcount == 0:
                return root, 1, root.val, root.val
            if lcount > rcount:
                if lMaxNum < root.val and lnode == root.left and rcount == 0:
                    return root, lcount + 1, root.val, lMinNum
                else:
                    return lnode, lcount, lMaxNum, lMinNum
            else:
                if root.val < rMinNum and rnode == root.right and lcount == 0:
                    return root, rcount + 1, rMaxNum, root.val
                else:
                    return rnode, rcount, rMaxNum, rMinNum
    def getMax(self, root):
        # write code here
        node, count, maxNum, minNum = self.getNode(root)
        return node
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值