首页 > 编程语言 >代码随想录算法训练营,9月16日 | 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

代码随想录算法训练营,9月16日 | 235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

时间:2024-09-16 10:51:55浏览次数:9  
标签:right TreeNode val root 二叉 搜索 树中 left

235. 二叉搜索树的最近公共祖先
题目链接:235. 二叉搜索树的最近公共祖先
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰二叉搜索树的最近公共祖先
日期:2024-09-16

想法:相比于普通二叉树,二叉搜索树从上往下遍历,在qp中间的值的一定是公共祖先,而第一个则是最近,因为此时你在这个祖先节点无论往左往右都会让其左右子树之一丢失q,或者p。
Java代码如下:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val > p.val && root.val > q.val){
            TreeNode left = lowestCommonAncestor(root.left, p, q);
            if(left != null){
                return left;
            }
        }else if(root.val < p.val && root.val < q.val){
            TreeNode right = lowestCommonAncestor(root.right, p, q);
            if(right != null){
                return right;
            }
        }
        return root;
    }
}

总结:函数有返回值,新定义一个结点存遍历结果的操作是搜索整个树,而直接if判断是搜索一条边。

701.二叉搜索树中的插入操作
题目链接:701.二叉搜索树中的插入操作
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰二叉搜索树中的插入操作
日期:2024-09-16

想法:比较目标值和节点值大小,大了往右,小了往左,遇到空节点就可以插入新节点了。
Java代码如下:

class Solution {
    public TreeNode insertIntoBST(TreeNode root, int val) {
        if(root == null){
            TreeNode node = new TreeNode(val);
            return node;
        }
        if(root.val > val){
            root.left = insertIntoBST(root.left, val);
        }
        if(root.val < val){
            root.right = insertIntoBST(root.right, val);
        }
        return root;
    }
}

总结:对于新增的节点,直接用root.left和root.right接住。

450.删除二叉搜索树中的节点
题目链接:450.删除二叉搜索树中的节点
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰删除二叉搜索树中的节点
日期:2024-09-16

想法:分析删除节点的5种情况:1.遍历下去没找到,返回null,2.找到了,节点左右子树为空,返回null,3.找到,左为空,返回右子树,4.找到,右为空,返回左,5.找到,左右子树都不空,画图分析,先找到右子树的最左节点,将左子树接到左节点的左边,返回右子树。
Java代码如下:

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null){
            return root;
        }
        if(root.val == key){
            if(root.left == null) return root.right;
            else if(root.right == null) return root.left;
            else{
                TreeNode cur = root.right;
                while(cur.left != null){
                cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }
        if(root.val > key) root.left = deleteNode(root.left, key);
        if(root.val < key) root.right = deleteNode(root.right, key);
        return root;
    }
}

总结:同样要用root.left和root.right接住

标签:right,TreeNode,val,root,二叉,搜索,树中,left
From: https://www.cnblogs.com/wowoioo/p/18416076

相关文章

  • 禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)
    目录一、采用TS求解TSP二、旅行商问题2.1实际例子:求解6个城市的TSP2.2==**求解该问题的代码**==2.3代码运行过程截屏2.4代码运行结果截屏(后续和其他算法进行对比)三、==如何修改代码?==3.1减少城市坐标,如下:3.2增加城市坐标,如下:四、禁忌搜索算法(TabuSearc......
  • C++数据结构-二叉树的三种遍历方法(进阶篇)
    1.遍历简介:树作为非线性数据结构,在我们取出数据时就需要设计遍历,所谓遍历,就是按照一定的规则性,将数据结构中的所有数据全部依次访问,而二叉树本身并不具有天然的全局次序,故为实现遍历,需通过在各节点与其孩子之间约定某种局部次序,间接地定义某种全局次序,这便是我们常规定的先序......
  • C++数据结构-二叉树的存储方法(基础篇)
    1.简介根据前文的介绍,我们知道了二叉树的性值,其就是一种每一个结点中只允许拥有左右孩子(或为空)的树,这种数据结构在我们的实际设计中非常常用,如前文提到的STL中的set集合,其底层就是一颗标准的红黑树(二叉树的一种),我们这里以创建一颗二叉树并实现通过特定的插入顺序和读取顺序达......
  • 纯C 生成二叉树广义表 根据广义表重构二叉树
    讲解很多都写在注释里了,重构二叉树的过程后面单独拿出来讲直接上代码:#include<stdio.h>#include<time.h>#include<stdlib.h>#include<limits.h>typedefstructBiTree{ intdata; structBiTree*next[2];}BiTree;BiTree*BiTree_init(intval)//节点初始化{......
  • 力扣热题100 - 二叉树:验证二叉搜索树
    题目描述:题号:98给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。解题思路:思路一......
  • 一张图精通多种搜索算法的选择策略(经验篇)
    在探索数据的海洋中,搜索算法是指引我们找到目标的灯塔。从简单的线性搜索到高效的二分搜索,再到深度优先与广度优先的图搜索,每种算法都以其独特的方式优化着搜索过程。无论是在数组、树结构还是散列表中,正确的搜索算法能显著提升查找效率。本文将带你一探线性搜索、二分搜索、深度优......
  • LeetCode_0144. 二叉树前序遍历 & LeetCode_0096. 二叉树中序遍历 & LeetCode_0145.
    题目描述  给你二叉树的根节点root,返回它节点值的前序/中序/后序遍历。递归写法LeetCode_0144.前序中左右voidmyPreorder(TreeNode*root,vector<int>&ans){if(!root){return;}ans.emplace_back(root->val);myPre......
  • 二叉树的所有路径(所有从根节点到叶子节点的路径)-257
    题目描述给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。解题思路这道题我们采用二叉树里的前序遍历方式,我们要遍历所有到叶子节点的路径,我们采用复用的思想,就是让这里的几个数据结构我们可以重复使用,但是重复使......
  • C++: 二叉树进阶面试题
    做每件事之前都心存诚意,就会事半功倍.目录前言1.根据二叉树创建字符串2.二叉树的层序遍历Ⅰ3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先5.二叉搜索树与双向链表6.根据一棵树的前序遍历与中序遍历构造二叉树7.根据一棵树的中序遍历与后序遍历构造二叉树8.二......
  • 二叉树的 Morris 中序遍历
    回顾问题陈述:给定一棵二叉树,实现中序遍历并返回包含其中序序列的数组例如给定下列二叉树:我们按照左、根、右的顺序递归遍历二叉树,得到以下遍历:最终中序遍历结果可以输出为:[3,1,9,2,4,7,5,8,6]MorristrickMorris中序遍历是一种树遍历算法,旨在实现O(1)的空间......