爪哇 2博客
爪哇 2博客

在Java中从二进制搜索树中删除节点

如果您想练习数据结构和算法程序,可以通过 100多个数据结构和算法面试问题.

在本文中,我们将看到如何从二进制搜索树中删除节点。

它有两个部分。
  • 搜索节点
  • 搜索该节点后,删除该节点。
从中删除节点时,可能需要考虑三种情况 二叉搜索树.
  • 如果节点有 no child
  • 如果节点有 one child
  • 如果节点有 二 孩子们.

如果节点没有子节点

这是非常简单的情况。我们需要搜索该节点并将其设置为空。

删除没有子级的二分搜索树的节点

如果节点有一个孩子

如果节点有一个子节点,则需要将已删除节点的父节点直接连接到已删除节点的子节点。

删除一个孩子的二分搜索树的节点

如果节点有两个孩子

这是复杂的情况。如果它有两个节点,则需要将节点的父节点连接到右子树的最左节点(最小)或左子树的最右节点(最大)。
让我们通过示例来了解这种情况:
删除具有两个孩子的二叉搜索树的节点

如您所见,我们将节点40替换为节点50。节点50是右子树40中的最小元素,并在移动后删除节点50,因为那里将有重复的节点。

为什么右子树的最小元素?

在这里我们正在使用 二叉搜索树 属性树可以用多种方式表示。

例如:

二进制搜索树表示

我们在删除具有两个孩子的节点时使用相同的属性。

爪哇 程序删除二进制搜索树中的节点

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
 
组织 .Arpit.爪哇2blog.二分搜索树;
 
上市 二元SearchTreeDeleteMain {
上市 静态的 树节点 {
整型 数据 ;
树节点 剩下 ;
树节点 ;
 
树节点( 整型 数据 ) {
这个. 数据 = 数据 ;
}
}
 
//获取二叉搜索树中的最小元素
上市 静态的 树节点 minimumElement(树节点 ) {
如果 (. 剩下 == 空值 )
返回 ;
其他 {
返回 minimumElement(. 剩下 );
}
}
 
上市 静态的 树节点 删除节点(树节点 , 整型 ) {
如果 ( == 空值 )
返回 空值 ;
如果 (. 数据 > ) {
. 剩下 = 删除节点(. 剩下 , );
} 其他 如果 (. 数据 < ) {
. = 删除节点(., );
 
} 其他 {
//如果nodeToBeDeleted有两个孩子
如果 (. 剩下 != 空值 && . != 空值 ) {
树节点 温度 = ;
//从右边寻找最小元素
树节点 minNodeForRight = minimumElement( 温度 .);
//用右侧子树中的最小节点替换当前节点
. 数据 = minNodeForRight. 数据 ;
//立即删除最小节点
. = 删除节点(., minNodeForRight. 数据 );
 
}
//如果nodeToBeDeleted只剩下一个孩子
其他 如果 (. 剩下 != 空值 ) {
= . 剩下 ;
}
//如果nodeToBeDeleted只有唯一的孩子
其他 如果 (. != 空值 ) {
= .;
}
//如果nodeToBeDeleted没有孩子(叶子节点)
其他
= 空值 ;
}
返回 ;
}
 
上市 静态的 树节点 (树节点 , 树节点 节点 ToBeInserted) {
如果 ( == 空值 ) {
= 节点 ToBeInserted;
返回 ;
}
 
如果 (. 数据 > 节点 ToBeInserted. 数据 ) {
如果 (. 剩下 == 空值 )
. 剩下 = 节点 ToBeInserted;
其他
(. 剩下 , 节点 ToBeInserted);
} 其他 如果 (. 数据 < 节点 ToBeInserted. 数据 )
如果 (. == 空值 )
. = 节点 ToBeInserted;
其他
(., 节点 ToBeInserted);
返回 ;
}
 
上市 静态的 虚空 为了(树节点 ) {
如果 ( == 空值 )
返回;
为了(. 剩下 );
系统..打印(. 数据 + );
为了(.);
}
 
上市 静态的 虚空 主要 ([] args) {
 
//创建一个二叉搜索树
树节点 根节点 = createBinarySearchTree();
 
系统..打印(“二叉树:”);
为了(根节点);
系统..打印();
系统..打印(“删除有两个孩子的节点40:”);
树节点 根节点Res = 删除节点(根节点, 40);
为了(根节点Res);
}
 
上市 静态的 树节点 createBinarySearchTree() {
树节点 根节点 = 树节点(40);
树节点 节点 20 = 树节点(20);
树节点 节点 10 = 树节点(10);
树节点 节点 30 = 树节点(30);
树节点 节点 60 = 树节点(60);
树节点 节点 50 = 树节点(50);
树节点 节点 70 = 树节点(70);
树节点 节点 5 = 树节点(5);
树节点 节点 13 = 树节点(13);
树节点 节点 55 = 树节点(55);
 
( 空值 , 根节点);
(根节点, 节点 20);
(根节点, 节点 10);
(根节点, 节点 30);
(根节点, 节点 60);
(根节点, 节点 50);
(根节点, 节点 70);
(根节点, 节点 5);
(根节点, 节点 13);
(根节点, 节点 55);
返回 根节点;
}
}
 

当您运行上述程序时,将得到以下输出:

1
2
3
4
5
6
 
二元 :
5 10 13 20 30 40 50 55 60 70
删除中 节点 40 哪一个 孩子们:
5 10 13 20 30 50 55 60 70
 


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 11月29日

    超过100个Java编码面试问题

    我一直在发布有关各种主题的数据结构和编码面试问题,例如数组,队列,堆栈,二叉树,LinkedList,字符串,数字,ArrayList等。因此,我合并了一系列Java编码面试问题以创建索引发布。每当我添加新的Java [时,我都会继续添加指向此帖子的链接[…]

  • 4月18日

    到达最后一个索引的最小跳转数

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何找到到达上一个索引的最小跳转数。问题给定一个正整数数组A(可能为零),每个索引表示[…]

  • 3月28日

    对0、1和2的数组进行排序

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何对0、1和2s的数组进行排序。我们已经看到了有关对数组中的0s和1s进行排序的文章。问题给定一个包含零的数组,[…]

  • 3月04

    通过跳转检查是否有可能到达给定数组的末尾

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。问题给定一个具有正整数作为元素的数组,该数组指示可以从数组中任何位置进行跳转的最大长度。检查是否可以[…]

  • 2月17日

    检查数组元素是否连续

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何检查数组元素是否连续。问题给定一个数组,我们需要检查数组是否包含连续的元素。例如:输入:array [] = {5,3,4,[…]

  • 2月04日

    O(Sqrt(height))中的K元树的LCA

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将了解如何在O(Sqrt(height))中找到K元树的最低公共祖先。我们已经看到了如何在O(n)复杂度中找到n元树的LCA。给定[…]

Comments

  1. 非常感谢您的解释。

    对删除代码有一些小的更正。
    //立即删除最小节点
    删除节点(root.right,minNodeForRight.data);

    上面的语句应该分配给root.right,否则将赢得重复的节点’t be removed.

    谢谢,
    卡西

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇 2博客