数据结构:二叉搜索树的增删查改
二叉搜索树的增删查改
- 二叉搜索树(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
数据结构:二叉搜索树的增删查改相关推荐
- 数据结构---二叉搜索树
数据结构-二叉搜索树 原理:参考趣学数据结构 代码: 队列代码: #pragma once #define N 100 #define elemType bstTree* #include<st ...
- 二叉搜索树的删除操作可以交换吗_JavaScript数据结构 — 二叉搜索树(BST)ES6实现...
1. 概述 最基本的数据结构是向量和链表,为了将二者的优势结合起来,我们引入了二叉树,可以认为二叉树是列表在维度上的拓展.而今天要介绍的二叉搜索树(BST)则是在形式上借鉴了二叉树,同时也巧妙借鉴了有 ...
- 【数据结构】顺序表的增删查改 (C语言实现)
文章目录 一.线性表 二.顺序表 1.什么是顺序表 2.顺序表的分类 三.动态顺序表的实现 1.结构的定义 2.顺序表的初始化 3.检查容量 4.在头部插入数据 5.在尾部插入数据 6.在指定位置插入 ...
- 数据结构 二叉搜索树BST的实现与应用
概念 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值 ...
- [学习][数据结构]二叉搜索树
定义 一棵二叉搜索树是以一棵二叉树来组织的,如下图.这样一棵树可以使用一个链表数据结构来表示,其中每个节点就是一个对象.除了key和卫星数据之外,每个节点还包含属性left.right和p,他们分别指 ...
- 数据结构——二叉搜索树
一.定义 二叉搜索树(binary search tree),又叫二叉查找树.二叉排序树.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于 ...
- 数据结构之单链表的增删查改等操作画图详解
单链表 文章目录 单链表 链表的概念及其结构 概念 结构 链表的实现 开辟一个新结点 链表的销毁 打印链表 单链表的尾插 单链表的头插 单链表的头删 单链表的尾删 找到单链表中的一个结点 在pos位置 ...
- 数据结构 二叉搜索树的删除
文章目录 概述 待删除的结点没有子树 待删除的结点仅有一颗子树 待删除的结点有两颗子树 C代码实现 概述 这是一篇短文,专门考究一下二叉搜索树的删除. 二叉搜索树的建立非常简单,如果不熟悉的见此文 树 ...
- 数据结构——二叉搜索树的C语言实现
1.什么是二叉搜索树? 2.二叉搜索树的操作 3.二叉搜索树的C语言实现 #include<stdio.h> #include<stdlib.h>#define Element ...
最新文章
- 什么是分布式计算系统?—Vecloud微云
- Scala伴生类和伴生对象
- 第一次更名为OpenInfra的“她”,给我们带来了哪些惊喜?| 技术头条
- python与机器学习(七)上——PyTorch搭建LeNet模型进行MNIST分类
- python获取某天的属于第几周等时间问题
- Android中Context的详细介绍
- opencv-图像平滑处理
- 2019游戏开发学习路线:游戏程序员的核心竞争力是......
- 数据分析与处理python实验报告_实验报告的实验数据分析与处理怎么写?
- 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。 该校验的过程:1、从卡号最后一位数字开始,逆
- 牛客小白月赛24 J.建设道路
- 近红外光谱预处理方法
- 网赚无货源模式,无货源真的可以赚钱么?
- CPU综合设计实验报告
- 利用数据与其他数据源
- Flash 2004 7.02 中文版出来了.. 哈哈.。
- Java中的多态如何理解——详解
- 去掉百度搜索右侧的搜索热点
- 代理IP,可以帮助企业开展哪些业务?
- 7,37,67,97,127,1577,37,67,97,127,157 这样完全由素数组成的等差数列,求等差素数的最小公差