代码随想录day18|530二叉搜索树最小绝对差501二叉搜索树众数236二叉树最近公共祖先|01笔记

44 阅读1分钟
  • 530二叉搜索树最小绝对差

  • 代码随想录 (programmercarl.com)
  • 讲解观后感

  • 二叉树的中序遍历直接是个有序数组,比较起来很方便。
  • 解题代码

  •     // 中序遍历的同时计算最小值
        func getMinimumDifference(root *TreeNode) int {
            // 保留前一个节点的指针
            var prev *TreeNode
            // 定义一个比较大的值
            min := math.MaxInt64
            var travel func(node *TreeNode)
            travel = func(node *TreeNode) {
                if node == nil {
                    return 
                }
                travel(node.Left)
                if prev != nil && node.Val - prev.Val < min {
                    min = node.Val - prev.Val
                }
                prev = node
                travel(node.Right)
            }
            travel(root)
            return min
        }
    
  • 因为是有序递增,所以node.Val - prev.Val必然大于0
  • 501二叉搜索树中的众数

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 遍历结点,用map统计频率让然后排序
  • 讲解观后感

  • 因为二叉搜索树的中序遍历是有序的,一次遍历可以利用maxcount值,只要当前数值的count等于maxcount就放入结果集。当更新maxcount时,清空结果集。
  • 也可以使用二次遍历,第一次寻找最大频率,第二次将等于最大频率值放入结果集即可。
  • 解题代码

  •     func findMode(root *TreeNode) []int {
            res := make([]int, 0)
            count := 1
            max := 1
            var prev *TreeNode
            var travel func(node *TreeNode) 
            travel = func(node *TreeNode) {
                if node == nil {
                    return
                }
                travel(node.Left)
                if prev != nil && prev.Val == node.Val {
                    count++
                } else {
                    count = 1
                }
                if count >= max {
                    if count > max && len(res) > 0 {
                        res = []int{node.Val}
                    } else {
                        res = append(res, node.Val)
                    }
                    max = count
                }
                prev = node
                travel(node.Right)
            }
            travel(root)
            return res
        }
    
  • 二叉树的最近公共祖先

  • 代码随想录 (programmercarl.com)
  • 第一印象

  • 暴力的方法可以是遍历树得到从根结点到两个结点的路径,然后比较两个路径,得到最后一个重合的结点。
  • 讲解观后感

  • 后序遍历的过程就是一个天然的自底向上查找。因为本题二叉树不存在重复结点,所以可以利用一个结点的左右子树会不会各自存在两个目标结点来判定其是否为最近祖先。找到祖先节点后再返回其本身即可。
  • 解题代码

  •     
        func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
            // check
            if root == nil {
                return root
            }
            // 相等 直接返回root节点即可
            if root == p || root == q {
                return root
            }
            // Divide
            left := lowestCommonAncestor(root.Left, p, q)
            right := lowestCommonAncestor(root.Right, p, q)
        
            // Conquer
            // 左右两边都不为空,则根节点为祖先
            if left != nil && right != nil {
                return root
            }
            if left != nil {
                return left
            }
            if right != nil {
                return right
            }
            return nil
        }