diff --git a/problems/0501.二叉搜索树中的众数.md b/problems/0501.二叉搜索树中的众数.md index dfd589ce..3ca7d892 100644 --- a/problems/0501.二叉搜索树中的众数.md +++ b/problems/0501.二叉搜索树中的众数.md @@ -428,7 +428,100 @@ class Solution: return self.res ``` Go: +暴力法(非BSL) +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ +func findMode(root *TreeNode) []int { + var history map[int]int + var maxValue int + var maxIndex int + var result []int + history=make(map[int]int) + traversal(root,history) + for k,value:=range history{ + if value>maxValue{ + maxValue=value + maxIndex=k + } + } + for k,value:=range history{ + if value==history[maxIndex]{ + result=append(result,k) + } + } + return result +} +func traversal(root *TreeNode,history map[int]int){ + if root.Left!=nil{ + traversal(root.Left,history) + } + if value,ok:=history[root.Val];ok{ + history[root.Val]=value+1 + }else{ + history[root.Val]=1 + } + if root.Right!=nil{ + traversal(root.Right,history) + } +} +``` + +计数法BSL(此代码在执行代码里能执行,但提交后报错,不知为何,思路是对的) + +```go +/** + * Definition for a binary tree node. + * type TreeNode struct { + * Val int + * Left *TreeNode + * Right *TreeNode + * } + */ + var count,maxCount int //统计计数 +func findMode(root *TreeNode) []int { + var result []int + var pre *TreeNode //前指针 + if root.Left==nil&&root.Right==nil{ + result=append(result,root.Val) + return result + } + traversal(root,&result,pre) + return result +} +func traversal(root *TreeNode,result *[]int,pre *TreeNode){//遍历统计 + //如果BSL中序遍历相邻的两个节点值相同,则统计频率;如果不相同,依据BSL中序遍历排好序的性质,重新计数 + if pre==nil{ + count=1 + }else if pre.Val==root.Val{ + count++ + }else { + count=1 + } + //如果统计的频率等于最大频率,则加入结果集;如果统计的频率大于最大频率,更新最大频率且重新将结果加入新的结果集中 + if count==maxCount{ + *result=append(*result,root.Val) + }else if count>maxCount{ + maxCount=count//重新赋值maxCount + *result=[]int{}//清空result中的内容 + *result=append(*result,root.Val) + } + pre=root//保存上一个的节点 + if root.Left!=nil{ + traversal(root.Left,result,pre) + } + if root.Right!=nil{ + traversal(root.Right,result,pre) + } +} +```