首页 > 其他分享 >[代码随想录]Day18-二叉树part07

[代码随想录]Day18-二叉树part07

时间:2023-08-15 20:13:08浏览次数:38  
标签:TreeNode nil int root 随想录 二叉树 res return Day18

题目:530. 二叉搜索树的最小绝对差

思路:

一个关键问题——BST的中序遍历是由小到大的顺序,也就是说记录遍历的前一个节点,每次比较当前节点-前一个节点的值即可(因为由小到大所以当前>前一个)

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var pre *TreeNode
var res int
func getMinimumDifference(root *TreeNode) int {
    pre = nil
    res = math.MaxInt64
    step(root)
    return res
}
func step(root *TreeNode) {
    if root == nil { // 空返回
        return 
    }
    step(root.Left) // 前
    if pre != nil { // 如果不是空就比较
        res = min(res, root.Val - pre.Val)
    }
    pre = root // 记录节点
    step(root.Right) // 后
}
func min(a,b int)int {
    if a < b {
        return a
    }
    return b
}

参考:

代码随想录

题目:501. 二叉搜索树中的众数

思路:

同上,不过有可能有多个众数,因此要额外加一个判断:

  1. 如果和现在的最大值相等就添加
  2. 如果比现在最大值大就清空后添加

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var res []int
var count, maxCount int
var pre *TreeNode
func findMode(root *TreeNode) []int {
    res = []int{}
    count, maxCount = 0, 0
    pre = nil
    step(root)
    return res
}

func step(root *TreeNode) {
    if root == nil { // 返回空
        return
    }
    step(root.Left) // 前
    if pre == nil { // 如果为空就开始计数
        count = 1
    }else if pre.Val == root.Val { // 相等就记录数+1
        count++
    }else {  // 不相等重新计数
        count = 1
    }
    pre = root // 记录前一个节点
    if count == maxCount { // 和当前众数个数相同的往里添加
        res = append(res, root.Val)
    }
    if count > maxCount { // 比当前大清空后添加
        maxCount = count
        res = append([]int{},root.Val)
    }
    step(root.Right)
}

参考:

代码随想录

题目:236. 二叉树的最近公共祖先

思路:

  1. 当遇到p或者q直接返回p或者q
  2. 当一个节点的左子树和右子树都有返回值(p和q),返回该节点
  3. 只有一个子树有返回值,返回有返回值的子树
  4. 没有返回值,返回nil

代码:

/**
 * 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 {
        return nil
    }
    if root == p || root == q{ // 找到子树先
        return root
    }
    left := lowestCommonAncestor(root.Left, p, q) // 左子树
    right := lowestCommonAncestor(root.Right, p, q) // 右子树
    if left == nil && right != nil { // 左nil 右有返回右
        return right
    }
    if left != nil && right == nil { // 右nil 左有返回左
        return left
    }
    if left != nil && right != nil { // 都有返回当前子树
        return root
    }
    return nil // 没有返回空
}

参考:

代码随想录

标签:TreeNode,nil,int,root,随想录,二叉树,res,return,Day18
From: https://www.cnblogs.com/wtcsky/p/17632315.html

相关文章

  • 代码随想录算法训练营第十一天|力扣20.有效的括号、力扣1047.删除字符串中所有相邻重
    有效的括号(力扣20.)括号匹配时使用栈解决的经典问题题意其实就像我们在写代码的过程中,要求括号的顺序是一样的有左括号,那么在对应位置则必须有右括号第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以returnfalse第二种情况:遍历字......
  • 二叉树:自下而上,从左到右的层次遍历
    利用栈先进后出的特性,将出队元素依次进栈,然后依次出栈即可完成。#include<stdio.h>#include<stdlib.h>#defineMaxSize100//二叉树的结点类型typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode,*Tree;//队列的结点类型typedefstru......
  • 【剑指Offer】 24、二叉树中和为某一值的路径
    【剑指Offer】24、二叉树中和为某一值的路径题目描述:输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意:在返回值的list中,数组长度大的数组靠前)解题思路:本题实......
  • [代码随想录]Day17-二叉树part06
    题目:654.最大二叉树思路:和前中序构造树差不多的方法,以前是返回值,现在是返回树代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode*Right*TreeNode*}*/funcconstructMaximumBinaryTree(nums[]in......
  • 二叉树
    1概念二叉树BinaryTree是n个结点的有限集合。它或者是空集n=0,或者是由一个根结点以及两颗互不相交、分别称为左子树和右子树的二叉树组成。   76 354 21根结点根结点的左子树根结点的右子树二叉树与普通有序树不同,二叉树严格区分左子和右子,即使只有一个子结点也要区分左......
  • 二叉树的迭代遍历-栈
    二叉树的迭代遍历-栈二叉树的递归遍历书写简单,做题时能够帮助快速完成dfs但是往往有某些面试官或者题目要求,使用迭代法完成树的遍历作为复习材料,不导出推导过程,只给出核心记忆点TreeNodepublicclassTreeNode{intval;TreeNodeleft;TreeNoderight;......
  • 二叉树的层次遍历
    #include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructTreeNode{ intdata; structTreeNode*lchild,*rchild;}TreeNode,*Tree;typedefstruct{ TreeNode*data[MaxSize]; intfront; intrear;}Queue;voidInitQueue(Queue......
  • 二叉树的非递归遍历
    //非递归操作#include<stdio.h>#include<stdlib.h>#defineMaxSize200typedefstructTreeNode{intdata;structTreeNode*lchild,*rchild;}TreeNode,*Tree;typedefstruct{Treedata[MaxSize];inttop;}Stack;voidInitStack(S......
  • 二叉树的递归遍历
    #include<stdio.h>#include<stdlib.h>typedefstructTNode{intdata;structTNode*lchild,*rchild;}TreeNode,*Tree;/*在这段代码中,递归函数`CreateTree`在执行`return`语句后,会立即返回到调用它的上一层递归调用。但是,整个递归过程并没有结束,仍然会......
  • 二叉树的层序遍历
    intfindBottomLeftValue(TreeNode*root){queue<TreeNode*>qu;if(root!=nullptr)qu.push(root);intsize=0;intresult=0;while(!qu.empty()){TreeNode*temp;size=qu.size();......