✨数据结构与算法:二叉搜索树
- 🍊1. 二叉搜索树的概念
- 🍊2.二叉搜索树中的查找
- 🍊3.二叉搜索树的插入
- 🍊4.删除二叉搜索树中的一个节点(较复杂)
- 🍊5.判断是不是二叉搜索树(易错)
- 🍊结束语
📃 个人主页: 不断前进的皮卡丘
🌞博客描述:梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记
🔥网站推荐:千里之行,始于足下。每天坚持刷题,巩固所学知识,也为将来找工作,面试做好准备----- 牛客网刷题神器
🍊1. 二叉搜索树的概念
🎈二叉搜索树又叫做二叉排序树,它具有下面的几个性质:
1️⃣若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2️⃣若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3️⃣它的左、右子树也分别为二叉排序树
🍊2.二叉搜索树中的查找
给定一棵二叉搜索树,以及一个值val,如果二叉搜索树中存在值和val相同的节点,则返回这个节点,否则返回null
public TreeNode searchBST(TreeNode root, int val) {
if(root==null) return null;
TreeNode curr=root;
while(curr!=null){
if(curr.val==val){
return curr;
}else if(curr.val<val){
curr=curr.right;
}else{
curr=curr.left;
}
}
//循环外面说明没有找到
return null;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
🍊3.二叉搜索树的插入
NC372 插入二叉搜索树
二叉搜索树的插入需要考虑下面几种情况
1️⃣根节点为空,那么待插入的节点就作为二叉搜索树的根节点
2️⃣根节点非空,则找到待插入的位置
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param val int整型
* @return TreeNode类
*/
public TreeNode insertToBST (TreeNode root, int val) {
// write code here
if(root==null) return new TreeNode(val);
TreeNode curr=root;
TreeNode parent=null;
while(curr!=null){
if(curr.val==val){
break;
}else if(curr.val<val){
parent=curr;
curr=curr.right;
}else{
parent=curr;
curr=curr.left;
}
}
if(curr==parent.left){
parent.left=new TreeNode(val);
}else{
parent.right=new TreeNode(val);
}
return root;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
🍊4.删除二叉搜索树中的一个节点(较复杂)
NC297 删除一个二叉搜索树中的节点
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @param key int整型
* @return TreeNode类
*/
public TreeNode deleteNode(TreeNode root, int key) {
root = delete(root,key);
return root;
}
private TreeNode delete(TreeNode root, int key) {
if (root == null) return null;
if (root.val > key) {
root.left = delete(root.left,key);
} else if (root.val < key) {
root.right = delete(root.right,key);
} else {
if (root.left == null) return root.right;
if (root.right == null) return root.left;
TreeNode tmp = root.right;
while (tmp.left != null) {
tmp = tmp.left;
}
root.val = tmp.val;
root.right = delete(root.right,tmp.val);
}
return root;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
🍊5.判断是不是二叉搜索树(易错)
NC184 判断是不是二叉搜索树
判断是不是二叉搜索树,就是看这棵二叉树是否满足二叉搜索树的性质,当二叉搜索树进行中序遍历的时候,它们的节点的值是按照从小到大排序的,我们可以利用这个性质来解答。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 访问左子树
if (!isValidBST(root.left)) {
return false;
}
// 访问当前节点:如果当前节点小于等于中序遍历的前一个节点,说明不满足BST,返回 false;否则继续遍历。
if (root.val <= pre) {
return false;
}
pre = root.val;
// 访问右子树
return isValidBST(root.right);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
🍊结束语
希望大家可以自己动手练习一下,算法光看是不行的,必须亲自动手敲代码,有时候你会发现自己有思路,但是又写不出来,这就是缺乏练习的原因。大家平时在做题的时候,可以多思考,多总结。
刚开始的时候,我们可能遇到一种新的题型,完全没有思路的时候,其实可以先去看看别人的思路,还有题解,把它理解下来,然后把代码敲出来(不要复制粘贴,我们根据自己的理解敲出代码这样才有效果,如果中途卡住了,也可以再回过头去看看)
另外,为了检测一下我们是否真正的掌握,我们可以去做几道相似的题目巩固一下,顺便检验一下自己的成果。
点此跳转去练习
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44672 人正在系统学习中