在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 |
Comments
非常感谢Arpit,这对于新手来说非常好,干净且易于理解的代码!
非常感谢您的解释。
对删除代码有一些小的更正。
//立即删除最小节点
删除节点(root.right,minNodeForRight.data);
上面的语句应该分配给root.right,否则将赢得重复的节点’t be removed.
谢谢,
卡西