二叉搜索树(BST)的插入和删除递归实现
思路
二叉搜索树的插入
TreeNode InsertRec(rootNode, key) =
if rootNode == NULL, return new Node(key)
if key >= rootNode.data, rootNode.rightChild = InsertRec(rootNode.rightChild, key)
if Key < rootNode.data, rootNode.leftChild = InsertRec(rootNode.leftChild, key)
Context is: currentNode的reference 和要插入的key.
把key插入一个以rootNode为根的子树中去
二叉搜索树的删除
TreeNode DeleteRec(rootNode, key) =
if rootNode == NULL, return rootNode
if key >= rootNode.data, rootNode.rightChild = DeleteRec(rootNode.rightChild, key)
if Key < rootNode.data, rootNode.leftChild = DeleteRec(rootNode.leftChild, key)
Context is: currentNode的reference 和要删除的key.
把key从一个以rootNode为根的子树中删去
在base case里,
- 如果是叶子节点返回空即可,
- 如果是单子节点,如果左子为空就返回右子。如果右子为空,就返回左子。
- 如果被删节点有两个孩子,则组要借助util找到中序遍历的后继节点, take 其值,然后再递归删除successor节点。
实现
/// <summary>
/// insert record to BST recursively
/// </summary>
/// <param name="root">current root node</param>
/// <param name="key">the value of the element to be inserted</param>
public TreeNode<T> InsertRec(TreeNode<T> rootNode, T key)
{
if (rootNode == null)
{
rootNode = new TreeNode<T>();
rootNode.data = key;
return rootNode;
} if (key.CompareTo(rootNode.data) < )
{
rootNode.leftChild = InsertRec(rootNode.leftChild, key);
}
else
{
rootNode.rightChild = InsertRec(rootNode.rightChild, key);
} return rootNode;
} public void DeleteKey(T key)
{
this.root = DeleteRec(root, key);
} public void InsertKey(T key)
{
this.root = InsertRec(root, key);
} /// <summary>
/// Delete record from BST recursively
/// </summary>
/// <param name="rootNode">root node</param>
/// <param name="Key">value of the element</param>
/// <returns></returns>
public TreeNode<T> DeleteRec(TreeNode<T> node, T key)
{
if (node == null)
{
return null;
} if (key.CompareTo(node.data) < )
{
node.leftChild = DeleteRec(node.leftChild, key);
}
else if (key.CompareTo(node.data) > )
{
node.rightChild = DeleteRec(node.rightChild, key);
}
else // find the node, node is the one to be deleted
{
if (node.leftChild == null)
{
return node.rightChild;
}
else if (node.rightChild == null)
{
return node.leftChild;
}
else
{
// need to handle the root?
T value = GetMinValue(node);
node.data = value;
node.rightChild = DeleteRec(node.rightChild, value);
}
} return node;
} private T GetMinValue(TreeNode<T> node)
{
if (node == null)
{
throw new Exception("node is null.");
} if (node.rightChild != null)
{
TreeNode<T> temp = node.rightChild;
while (temp.leftChild != null)
{
temp = temp.leftChild;
} return temp.data;
}
else
{
throw new Exception("successor node is not found");
}
}
二叉搜索树(BST)的插入和删除递归实现的更多相关文章
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历 二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则 ...
- 二叉搜索树的结构(30 分) PTA 模拟+字符串处理 二叉搜索树的节点插入和非递归遍历
二叉搜索树的结构(30 分) 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 萌新笔记之二叉搜索树(BST)
前言,以前搞过线段树,二叉树觉得也就那样= =.然后数据结构的课也没怎么听过,然后下周期中考... 本来以为今天英语考完可以好好搞ACM了,然后这个数据结构期中考感觉会丢人,还是好好学习一波. 二叉搜 ...
- 给定一个二叉搜索树(BST),找到树中第 K 小的节点
问题:给定一个二叉搜索树(BST),找到树中第 K 小的节点. 出题人:阿里巴巴出题专家:文景/阿里云 CDN 资深技术专家. 考察点: 1. 基础数据结构的理解和编码能力 2. 递归使用 参考答案 ...
- 二叉搜索树-php实现 插入删除查找等操作
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的 ...
- 二叉搜索树 (BST) 的创建以及遍历
二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...
- 二叉搜索树(BST)
(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了 ...
- 数据结构---二叉搜索树BST实现
1. 二叉查找树 二叉查找树(Binary Search Tree),也称为二叉搜索树.有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一 ...
随机推荐
- 强化学习(六):n-step Bootstrapping
n-step Bootstrapping n-step 方法将Monte Carlo 与 one-step TD统一起来. n-step 方法作为 eligibility traces 的引入,eli ...
- kindle完结书单
1.一个人的好天气---青山七惠 2.嫌疑人X的献身---东野圭吾 3.活着---余华 4.最漫长的旅行---Nicholas Sparks 5.解忧杂货店---东野圭吾 6.追风筝的人---卡勒德· ...
- String字符串的常用方法
1.substr():可在字符串中抽取从 start 下标开始的指定数目的字符. stringObject.substr(start,length) start:必需.要抽取的子串的起始下标.必须是数 ...
- 【转】IIS - 自动申请、部署Let's Encrypt的免费SSL证书
IIS - 自动申请.部署Let's Encrypt的免费SSL证书(让网站实现HTTPS协议) 2017-12-19发布:hangge阅读:161 一.HTTPS 协议介绍 1,什么是 HTTP ...
- 基于Protostuff实现的Netty编解码器
在设计netty的编解码器过程中,有许多组件可以选择,这里由于咱对Protostuff比较熟悉,所以就用这个组件了.由于数据要在网络上传输,所以在发送方需要将类对象转换成二进制,接收方接收到数据后,需 ...
- 转载:Shell 脚本加密 - 略有修改
shc是一个加密shell脚本的工具.它的作用是把shell脚本转换为一个可执行的二进制文件. shc 安装 yum -y install shc 如果yum不能安装,请移步官方下载rpm包 http ...
- javascript 中的number
大家都知道javascript中有五种简单数据类型,number,string,boolean,null,undefined,复杂数据类型是object.本文主要记录下number类型的一些可能不太常 ...
- js的回调函数
介绍首先从英文介绍开始 A callback is a function that is passed as an argument to another function and is execut ...
- Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一.实例成员与类成员 1. 当类的字节码被加载到内存, 类中类变量.类方法即被分配了相应内存空间.入口地址(所有对象共享). 2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同 ...
- jmert中如何测试上传文件接口(测试上传excel文件)
第一次用jmeter这个工具测试上传接口,以前没做过这一块,导致走了很多弯路.特地把经验谢谢,怕自己以后忘记... 一,jmeter如何上传文件 jmeter 的 http requests post ...