您的位置:首页 > 其它

Find Mode in Binary Search Tree

2017-08-15 00:27 417 查看
题目详情: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:#为空直接返回

4000
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: