1.合并二叉树
通过遍历的方式进行,这里采用的前序遍历
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1==nil{
return root2
}
if root2==nil{
return root1
}
//修改t1的数值和结构
root1.Val += root2.Val
root1.Left = mergeTrees(root1.Left,root2.Left)
root1.Right = mergeTrees(root1.Right,root2.Right)
return root1
}
2.二叉搜索树中的搜索
func searchBST(root *TreeNode, val int) *TreeNode {
if root==nil{
return nil
}
if root.Val>val{
return searchBST(root.Left,val)
}else if root.Val<val{
return searchBST(root.Right,val)
}else{
return root
}
return nil
}
3.验证二叉搜索树
基于中序遍历,如果是二叉搜索树,应该是一个升序的数组。
func isValidBST(root *TreeNode) bool {
arr := make([]int,0)
midOrder(root,&arr)
for i:=1;i<len(arr);i++{
if arr[i-1]>=arr[i]{
return false
}
}
return true
}
func midOrder(root *TreeNode,arr *[]int){
if root==nil{
return
}
midOrder(root.Left,arr)
*arr = append(*arr,root.Val)
midOrder(root.Right,arr)
}
4.二叉搜索树的最小绝对差
中序遍历,秒杀
func getMinimumDifference(root *TreeNode) int {
arr := make([]int,0)
minNum := 1000000000
midOrder(root,&arr)
for i:=1;i<len(arr);i++{
if arr[i]-arr[i-1]<minNum{
minNum = arr[i]-arr[i-1]
}
}
return minNum
}
func midOrder(root *TreeNode,arr *[]int){
if root==nil{
return
}
midOrder(root.Left,arr)
*arr = append(*arr,root.Val)
midOrder(root.Right,arr)
}
5.二叉搜索树种的众数
遍历+map统计
func findMode(root *TreeNode) []int {
m := make(map[int]int, 0)
ans := make([]int, 0)
maxCount := 0
preOrder(root, m, &maxCount)
for key, value := range m {
if value == maxCount {
ans = append(ans, key)
}
}
return ans
}
func preOrder(root *TreeNode, m map[int]int, maxCount *int) {
if root == nil {
return
}
if _, ok := m[root.Val]; !ok {
m[root.Val] = 1
} else {
m[root.Val] += 1
}
if m[root.Val] > *maxCount {
*maxCount = m[root.Val]
}
preOrder(root.Left, m, maxCount)
preOrder(root.Right, m, maxCount)
}
6.二叉树的最近公共祖先
借用后序遍历
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root==p || root==q || root==nil{
return root
}
left := lowestCommonAncestor(root.Left,p,q)
right := lowestCommonAncestor(root.Right,p,q)
if left != nil && right!= nil{//root为祖先
return root
}else if left == nil && right != nil{//right为祖先
return right
} else if left != nil && right == nil{//left为祖先
return left
}else{
return nil
}
}