二叉查找树中节点的删除

二叉查找树重要性质:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

 (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

现有,如下一棵二叉查找树。

(图1)

现在,若要删除图1中,任意节点,需要考虑如下三种情况:

(1)需要删除的节点下并没有其他子节点。

(2)需要删除的节点下有一个子节点(左或右)。

(3)需要删除的节点下有两个子节点(既左右节点都存在)。

第一种情况直接删除即可,下面,直接讨论第二种情况。

若我们要删除的是3号节点,由图1可以看到,它下面还有一个4号子节点。由下图2,可以看出,对于这种办法,我们只需要想办法,让5号节点的左子树的指针指向4就可以了。

(图2)

第三种情况,既我们要删除的节点下,有2个子节点。如图3,我们先在需要删除的节点的右子树中,找到一个最小的值(因为右子树中的节点的值一定大于根节点)。然后,用找到的最小的值与需要删除的节点的值替换。然后,再将最小值的原节点进行删除(图4)。

(图3)

(图4)

好了,思路大概就这样了。下面见代码。

[java] view plain copy

  1. private Node<T> remove(T data,Node<T> node)
  2. {
  3. if(data == null)
  4. return node;
  5. /**
  6. * compare函数内部实现大致如下:
  7. * ((comparable)data).compareTo(node.element);
  8. * 比较需要删除的数据与当前节点的值的大小
  9. */
  10. int result = compare(data,node.element);
  11. //result<0:表示需要删除的节点在左子树。(二叉查找数的性质)
  12. if(result<0)
  13. node.left = remove(data,node.left);
  14. else if(result>0)//在右子树
  15. node.right = remove(data,node.right);
  16. else if(node.left != null && node.right != null)//找到需要删除的节点且节点下有两个子节点
  17. {
  18. /**先找到需要删除的节点下,右子树中最小的节点
  19. * 并将它的值赋给需要删除的节点。
  20. * */
  21. node.element = findMin(node.right).element;
  22. //删除前面找到的最小的节点。
  23. node.right = remove(node.right);
  24. }
  25. else//找到需要删除的节点且节点下有一个子节点(左或者右)
  26. node = (node.left != null) ? node.left : node.right;
  27. }
  28. public void remove(T data)
  29. {
  30. this.remove(data,root);
  31. }

学习笔记。拍砖请轻拍。- -

时间: 2024-10-11 01:49:50

二叉查找树中节点的删除的相关文章

二叉查找树中元素的删除操作

关于二叉查找树的建立,插入,遍历(记住二叉查找树的中序遍历是所有元素由大到小排序结果)等操作,博主“C小加”写的很详细了,我主要补充二叉树的删除操作.删除操作主要难在对左右子节点都非空的节点的删除操作,这里可以找到该节点右节点中的最小值,即右子节点中的最左子树.找到后和需要删除的节点交换data等数据,然后删除这个最小子节点.实现代码如下,只需对需要删除节点的右子节点遍历一次: template<class T> void BST<T>::Deletepri(TreeNode<

删除二叉查找树的节点

想对于二叉查找树的查找.插入等操作来说,二叉查找树的删除操作是比较复杂的.在具体的分析中可以根据待删除节点的:1.左右子树均为空:2.左右子树中有一个为空:3.左右子树均非空的情况来考虑. 其中第3种情况即左右子树均非空的情况较为复杂,删除过程中可以找待删除节点的后继节点,与待删除节点交换,然后把后继节点的右子树接入到待删除节点的父节点即可. TreeNode* removeNode(TreeNode* root, int value) { // write your code here if(

lintcode 容易题:Insert Node in a Binary Search Tree 在二叉查找树中插入节点

题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 挑战 能否不使用递归? 解题: 递归的方法比较简单 Java程序: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public

LintCode(85)在二叉查找树中插入节点

题目 在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / 1 4 --> 1 4 / / \ 3 3 6 分析 递归和非递归两种方法实现. Python代码 """ Definition of TreeNode: class TreeNode: def __init__(self, val): self.val

LeetCode 530. Minimum Absolute Difference in BST(在二叉查找树中查找两个节点之差的最小绝对值)

题意:在二叉查找树中查找两个节点之差的最小绝对值 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: int ans = 0x3f3f3f3f; TreeNo

在二叉查找树中插入节点

给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树. 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / 1 4 --> 1 4 / / \ 3 3 6 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树. 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: (2)若右子树不空

Java实现二叉搜索树节点的删除

前言: 之前写过一篇关于二叉搜索树的博客:Java对二叉搜索树进行插入.查找.遍历.最大值和最小值的操作  二叉查找树重要性质: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3)左.右子树也分别为二叉排序树: 如图: 这次我想分享的是二叉搜索树中节点是如何删除的,删除节点是二叉搜索树常用的一般操作中最复杂的,删除节点要从查找要删除的节点开始入手 ,找到节点后,这个要删除的节点可能会有三种情况需要考虑: 1

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

在二叉查找树中查找不小于某个值的最小数值

给定一颗二叉查找树,给定一个值value,求该二叉查找树中不小于某个值value的最小数值. 思考:二叉查找树的特征就是左子节点比父节点值小,右子节点比父节点值大.在获得该二叉查找树根节点的情况下,想要得到该二叉查找树中不小于某个值得最小数值,分以下几点考虑: 1.如果currentNode.getData() == value , 则currentNode节点即为所求节点. 2.如果currentNode.getData() < value , 则当前节点的左子树所有节点的值均小于value,