Find Mode in Binary Search Tree

题目详情:https://leetcode.com/problems/find-mode-in-binary-search-tree/description/

自己写的代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        d={}
        result=[]
        Max=0
        self.postOrder(root,d)
        print d
        for k in d:#挑选出出现次数最多的值
            if d[k]>Max:
                Max=d[k]
                result=[k]
            elif d[k]==Max:
                result.append(k)
        return result
    def postOrder(self,root,d):
        if root:
            self.postOrder(root.left,d)
            self.postOrder(root.right,d)
            d[root.val]=d.get(root.val,0)+1#统计值出现的次数

根据提示写出来的代码,本题是中序遍历,又因为是BST,所以中序遍历的结果是有序的。设置一个preNode变量存储前一个遍历的节点,以便和当前访问的节点比较,前一个节点的值和当前节点的值相等,则将计数变量加1;不相等的话,说明是一个新的数字,则需要重新计数。然后和已知的出现的最大的次数比较,如果某个数出现的次数较多,则更新出现的最多的次数,并更新结果集。

语言差异:
我用python写的,int和TreeNode变量值的改变都无法同时更新,即都当作为基本的变量。所以被迫使用了list,比如:count=[1],max=[0]。


class Solution(object):
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root==None:#为空直接返回
            return []
        #preNode存储上一个访问的节点,result存储结果
        #count用以计数,某个数字出现的次数,m为已知的某个数出现的最大次数
        preNode,result,count,m=[None],[],[1],[0]
        self.inOrder(root,preNode,result,count,m)
        i=len(result)-1
        while result[i]!=":":
            i-=1
        return result[i+1:]
    def inOrder(self,root,preNode,result,count,m):
        if root!=None:
            self.inOrder(root.left,preNode,result,count,m)
            #该判断主要用于count计数
            if preNode[0]!=None:#如果前一个节点不为None
                if preNode[0].val==root.val:#前一个节点和本节点的值相等
                    count[0]+=1#那么将count[0]的值加1
                else:#如果前一个节点的值和本节点的值不相等,说明是新的一个数
                    count[0]=1#则重新计该数出现的次数
            if count[0]>=m[0]:
                if count[0]>m[0]:#如果某个数出现的次数较多
                    result.append(":")#加上个标记。不为什么不写为result=[],因为这样result的地址就变了
                result.append(root.val)#添加该数
                m[0]=count[0]#更新出现的最大的次数
            preNode[0]=root#更新访问过的前一个节点信息
            self.inOrder(root.right,preNode,result,count,m)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值