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

[代码随想录]Day19-二叉树part08

时间:2023-08-16 21:01:00浏览次数:55  
标签:part08 TreeNode nil Val 随想录 二叉树 return root Left

题目:235. 二叉搜索树的最近公共祖先

思路:

BST和普通二叉树不同的一点是可以根据特性来找最近公共祖先,只要找到第一个值比p大比q小(假设p<q)的节点返回即可。

image.png

代码:

/**
 * 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 p.Val > q.Val {
        p, q = q, p
    } // 保证p < q 范围取(p,q)
    return step(root,p,q)
}
func step(root, p, q *TreeNode) *TreeNode{
    if root == nil {
        return nil
    }
    if root.Val > q.Val { // 大于q,向左找
        left := step(root.Left, p, q)
        if left != nil {
            return left
        }
    }
    if root.Val < p.Val { // 小于p,向右找
        right := step(root.Right, p, q)
        if right != nil {
            return right
        }
    }
    return root //  现在是大于p 小于q,返回
}

参考:

代码随想录

题目:701. 二叉搜索树中的插入操作

思路:

BST的插入只需要找到第一个:

  1. 比val大且没有左子树的位置
  2. 比val小且没有右子树的位置

之后在该位置插入节点,向上递归返回即可。

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func insertIntoBST(root *TreeNode, val int) *TreeNode {
    if root == nil { // 如果是空插入
        return &TreeNode{Val:val,}
    }
    if val < root.Val { // 向左找,找到后返回
        root.Left = insertIntoBST(root.Left, val)
        return root
    }
    if val > root.Val { // 向右找,找到后返回
        root.Right = insertIntoBST(root.Right, val)
        return root
    }
    return nil
}

参考:

代码随想录

题目:450. 删除二叉搜索树中的节点

思路:

和上一题类似,这一题要先找到值为key的节点位置,然后把该节点的左子树放到右子树的最左下角。

image.png

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func deleteNode(root *TreeNode, key int) *TreeNode {
    if root == nil {
        return nil
    }
    if key < root.Val {
        root.Left = deleteNode(root.Left, key)
        return root
    }
    if key > root.Val {
        root.Right = deleteNode(root.Right, key)
        return root
    }
    // 下面是key == root.Val的情况
    if root.Right == nil {
        return root.Left
    }
    if root.Left == nil {
        return root.Right
    }
    left := root.Left // 记录删除节点左子树
    right := root.Right // 记录删除节点右子树
    root = root.Right // 进入右子树
    for root.Left != nil { // 找到最左侧节点
        root = root.Left
    }
    root.Left = left // 把左子树放到这里
    return right // 返回记录的右子树
}

参考:

代码随想录

标签:part08,TreeNode,nil,Val,随想录,二叉树,return,root,Left
From: https://www.cnblogs.com/wtcsky/p/17636162.html

相关文章

  • 【剑指Offer】38、二叉树的深度
    题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路:本题相对比较简单。根据二叉树深度的定义,我们有以下理解:如果一棵树只有一个结点,那么它的深度为1。如果根结点只有左子树而没有右子树,那么......
  • 代码随想录算法训练营第十三天|单调数列:滑动窗口最大值(力扣239.)、优先级队列:前k个高
    单调数列:滑动窗口最大值(力扣239.)给定滑动窗口的范围,求每个滑动窗口范围内的最大值使用单调队列实现对于最大值数字前面的数字不存入数列,对于最大值数字后面的数字存入数列中单调队列中数字的大小呈递减顺序pop(value):如果窗口移除的元素等于单调队列的队口元素,则pop;否则什......
  • [代码随想录]Day18-二叉树part07
    题目:530.二叉搜索树的最小绝对差思路:一个关键问题——BST的中序遍历是由小到大的顺序,也就是说记录遍历的前一个节点,每次比较当前节点-前一个节点的值即可(因为由小到大所以当前>前一个)代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Val......
  • 代码随想录算法训练营第十一天|力扣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......