Merge pull request #406 from X-shuffle/master

添加0071.0501.二叉搜索树中的众数 go版本
This commit is contained in:
程序员Carl
2021-06-17 09:06:13 +08:00
committed by GitHub
2 changed files with 141 additions and 0 deletions

View File

@ -265,6 +265,54 @@ class Solution:
else: return root
```
Go
> BSL法
```go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
//利用BSL的性质前序遍历有序
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root==nil{return nil}
if root.Val>p.Val&&root.Val>q.Val{//当前节点的值大于给定的值,则说明满足条件的在左边
return lowestCommonAncestor(root.Left,p,q)
}else if root.Val<p.Val&&root.Val<q.Val{//当前节点的值小于各点的值,则说明满足条件的在右边
return lowestCommonAncestor(root.Right,p,q)
}else {return root}//当前节点的值在给定值的中间(或者等于),即为最深的祖先
}
```
> 普通法
```go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
//递归会将值层层返回
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
//终止条件
if root==nil||root.Val==p.Val||root.Val==q.Val{return root}//最后为空或者找到一个值时,就返回这个值
//后序遍历
findLeft:=lowestCommonAncestor(root.Left,p,q)
findRight:=lowestCommonAncestor(root.Right,p,q)
//处理单层逻辑
if findLeft!=nil&&findRight!=nil{return root}//说明在root节点的两边
if findLeft==nil{//左边没找到,就说明在右边找到了
return findRight
}else {return findLeft}
}
```

View File

@ -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)
}
}
```