二叉搜索树的增删查改

  • 二叉搜索树(Binary Search Tree)
  • 基本操作之查找(Update)
  • 基本操作之修改(Update)
  • 基本操作之增加(Create)
  • 基本操作之删除(Delete)

二叉搜索树(Binary Search Tree)

二叉搜索树可以是一棵空树或者是一棵满足下列条件的二叉树:

  • 如果它的左子树不空,则左子树上所有节点值均小于它的根节点值。
  • 如果它的右子树不空,则右子树上所有节点值均大于它的根节点值。
  • 它的左右子树均为二叉搜索树(BST)。
  • 严格定义下BST中是没有值相等的节点的(No duplicate nodes)。

根据上述特性,我们可以得到一个结论:BST中序遍历得到的序列是升序的。

Java版

class TreeNode{int val;TreeNode left;TreeNode right;pubic TreeNode(int val) {this.val = val;this.left = this.right = null;}
}

Python版

class TreeNode:def __init__(self, val):self.val = valself.left, self.right = None, None

基本操作之查找(Update)

思路:

查找值为val的节点,如果val小于根节点则在左子树中查找,反之在右子树中查找

Java版

public TreeNode searchBST(TreeNode root, int val) {if (root == null) {return null;}// 未找到值为val的节点if (val < root.val) {return searchBST(root.left, val);//val小于根节点值,在左子树中查找} else if (val > root.val) {return searchBST(root.right, val);//val大于根节点值,在右子树中查找} else {return root;//找到了}
}

Python

def searchBST(root, val):if not root:return None # 未找到值为val的节点if val < root.val:return searchBST(root.left, val) # val小于根节点值,在左子树中查找哦elif val > root.val:return searchBST(root.right, val) # val大于根节点值,在右子树中查找else:return root

基本操作之修改(Update)

思路

查找值为val的节点,如果val小于根节点则在左子树中查找,反之在右子树中查找

Java版

public void updateBST(TreeNode root, int target, int val) {if (root == null) {return;}// 未找到target节点if (target < root.val) {updateBST(root.left, target, val);//target小于根节点值,在左子树中查找} else if (target > root.val) {updateBST(root.right, target, val);//target大于根节点值,在右子树中查找} else { //找到了root.val = val;}
}

Python

def updateBSTBST(root, target, val):if not root:return  # 未找到target节点if target < root.val:updateBST(root.left, target, val) # target小于根节点值,在左子树中查找哦elif target > root.val:updateBST(root.right, target, val) # target大于根节点值,在右子树中查找else:  # 找到了root.val = val

基本操作之增加(Create)

思路

  • 根节点为空,则待添加的节点为根节点
  • 如果待添加的节点值小于根节点,则在左子树中添加
  • 如果待添加的节点值大于根节点,则在右子树中添加
  • 我们统一在树的叶子节点(Leaf Node)后添加

Java版

public TreeNode insertNode(TreeNode root, TreeNode node) {if (root == null) {return node;}if (root.val > node.val) {root.left = insertNode(root.left, node);} else {root.right = insertNode(root.right, node);}return root;
}

Python

def insertNode(root, node):if not root:return nodeif root.val > node.val:root.left = insertNode(root.left, node)else:root.right = insertNode(root.right, node)return root

基本操作之删除(Delete)

思路

  • 考虑待删除的节点为叶子节点,可以直接删除并修改父亲节点(Parent Node)的指针,需要区分待删节点是否为根节点
  • 考虑待删除的节点为单支节点(只有一棵子树——左子树 or 右子树),与删除链表节点操作类似,同样的需要区分待删节点是否为根节点
  • 考虑待删节点有两棵子树,可以将待删节点与左子树中的最大节点进行交换,由于左子树中的最大节点一定为叶子节点,所以这时再删除待删的节点可以参考第一条

Java版

public TreeNode removeNode(TreeNode root, int value) {TreeNode dummy = new TreeNode(0);dummy.left = root;TreeNode parent = findNode(dummy, root, value);TreeNode node;if (parent.left != null && parent.left.val == value) {node = parent.left;} else if (parent.right != null && parent.right.val == value) {node = parent.right;} else {return dummy.left;}deleteNode(parent, node);return dummy.left;
}private TreeNode findNode(TreeNode parent, TreeNode node, int value) {if (node == null) {return parent;}if (node.val == value) {return parent;}if (value < node.val) {return findNode(node, node.left, value);} else {return findNode(node, node.right, value);}
}private void deleteNode(TreeNode parent, TreeNode node) {if (node.right == null) {if (parent.left == node) {parent.left = node.left;} else {parent.right = node.left;}} else {TreeNode temp = node.right;TreeNode father = node;while (temp.left != null) {father = temp;temp = temp.left;}if (father.left == temp) {father.left = temp.right;} else {father.right = temp.right;}if (parent.left == node) {parent.left = temp;} else {parent.right = temp;}temp.left = node.left;temp.right = node.right;}
}

Python

def removeNode(root, value):dummy = TreeNode(0)dummy.left = rootparent = findNode(dummy, root, value)node = Noneif parent.left and parent.left.val == value:node = parent.leftelif parent.right and parent.right.val == value:node = parent.rightelse:return dummy.leftdeleteNode(parent, node)return dummy.leftdef findNode(parent, node, value):if not node:return parentif node.val == value:return parentif value < node.val:return findNode(node,node.left, value)else:return findNode(node, node.right, value)def deleteNode(parent, node):if not node.right:if parent.left == node:parent.left = node.leftelse:parent.right = node.leftelse:temp = node.rightfather = nodewhile temp.left:father = temptemp = temp.leftif father.left == temp:father.left = temp.rightelse:father.right = temp.rightif parent.left == node:parent.left = tempelse:parent.right = temptemp.left = node.lefttemp.right = node.right

数据结构:二叉搜索树的增删查改相关推荐

  1. 数据结构---二叉搜索树

    数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...

  2. 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...

    1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...

  3. 【数据结构】顺序表的增删查改 (C语言实现)

    文章目录 一.线性表 二.顺序表 1.什么是顺序表 2.顺序表的分类 三.动态顺序表的实现 1.结构的定义 2.顺序表的初始化 3.检查容量 4.在头部插入数据 5.在尾部插入数据 6.在指定位置插入 ...

  4. 数据结构 二叉搜索树BST的实现与应用

    概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...

  5. [学习][数据结构]二叉搜索树

    定义 一棵二叉搜索树是以一棵二叉树来组织的,如下图.这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象.除了key和卫星数据之外,每个节点还包含属性left.right和p,他们分别指 ...

  6. 数据结构——二叉搜索树

    一.定义 二叉搜索树(binary search tree),又叫二叉查找树.二叉排序树.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于 ...

  7. 数据结构之单链表的增删查改等操作画图详解

    单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...

  8. 数据结构 二叉搜索树的删除

    文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...

  9. 数据结构——二叉搜索树的C语言实现

    1.什么是二叉搜索树? 2.二叉搜索树的操作 3.二叉搜索树的C语言实现 #include<stdio.h> #include<stdlib.h>#define Element ...

最新文章

  1. 什么是分布式计算系统?—Vecloud微云
  2. Scala伴生类和伴生对象
  3. 第一次更名为OpenInfra的“她”,给我们带来了哪些惊喜?| 技术头条
  4. python与机器学习(七)上——PyTorch搭建LeNet模型进行MNIST分类
  5. python获取某天的属于第几周等时间问题
  6. Android中Context的详细介绍
  7. opencv-图像平滑处理
  8. 2019游戏开发学习路线:游戏程序员的核心竞争力是......
  9. 数据分析与处理python实验报告_实验报告的实验数据分析与处理怎么写?
  10. 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆
  11. 牛客小白月赛24 J.建设道路
  12. 近红外光谱预处理方法
  13. 网赚无货源模式,无货源真的可以赚钱么?
  14. CPU综合设计实验报告
  15. 利用数据与其他数据源
  16. Flash 2004 7.02 中文版出来了.. 哈哈.。
  17. Java中的多态如何理解——详解
  18. 去掉百度搜索右侧的搜索热点
  19. 代理IP,可以帮助企业开展哪些业务?
  20. 7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,求等差素数的最小公差

热门文章

  1. 京东白条爆严重BUG!不法分子POS机疯狂套利
  2. kali终端字符串重叠
  3. 海客谈瀛洲,烟涛微茫信难求——微信
  4. 【气溶胶自动观测网AERONET相关经典CSDN博客阅读笔记总结】
  5. UE4 4.24像素流送学习整理
  6. 大学生计算机爱课程网,爱课程2020电脑版
  7. 金钥匙学校计算机,金钥匙学校新年贺词:为广大家长点赞
  8. LeetCode 破解保险箱(全排列)
  9. 【TA-霜狼_may-《百人计划》】图形3.6 纹理压缩——包体瘦身术
  10. 帆软如何把两个表格分页显示