二叉搜索树删除指定节点实现
若要删除一个BST的一个结点,需要考虑如下三种情况:
需要删除的节点下并没有其他子节点
需要删除的节点下有一个子节点(左或右)
需要删除的节点下有两个子节点(既左右节点都存在)
对这三种情况分别采取的措施是:
直接删除此结点
删除此结点,将此结点父节点连接到此结点左(右)子树
找出此结点右子树中的最小结点,用以代替要删除的结点,然后删除此最小结点
java简单实现
1 package interview.tree.interview; 2 3 import interview.loop.BinarySearch; 4 5 /** 6 * Created by BUAA514 on 2018-08-06. 7 * 二叉搜索树 8 */ 9 10 class TreeNode { 11 public int val; 12 public TreeNode leftNode; 13 public TreeNode rightNode; 14 15 TreeNode(int val) { 16 this.val = val; 17 this.leftNode = null; 18 this.rightNode = null; 19 } 20 } 21 22 23 public class BinarySearchTree { 24 25 /** 26 * 若要删除一个BST的一个结点,需要考虑如下三种情况: 27 需要删除的节点下并没有其他子节点 28 需要删除的节点下有一个子节点(左或右) 29 需要删除的节点下有两个子节点(既左右节点都存在) 30 对这三种情况分别采取的措施是: 31 直接删除此结点 32 删除此结点,将此结点父节点连接到此结点左(右)子树 33 找出此结点右子树中的最小结点,用以代替要删除的结点,然后删除此最小结点 34 35 * @param root 36 * @param val 37 * @return 38 */ 39 public TreeNode removeNode(TreeNode root, int val) { 40 if (root == null) { return null;} 41 if (root.val > val) { 42 root.leftNode = removeNode(root.leftNode, val); 43 }else if (root.val < val){ 44 root.rightNode = removeNode(root.rightNode,val); 45 }else { 46 if (root.leftNode == null && root.rightNode == null) { 47 root = null; 48 }else if (root.leftNode == null || root.rightNode == null){ 49 root = root.leftNode != null ? root.leftNode : root.rightNode; 50 }else { 51 TreeNode rightMinNode = root.rightNode; 52 while(rightMinNode.leftNode != null) { 53 rightMinNode = rightMinNode.leftNode; 54 } 55 root.val = rightMinNode.val; 56 root.rightNode = removeNode(root.rightNode,rightMinNode.val); 57 } 58 } 59 return root; 60 } 61 62 63 /** 64 * 暴力创建一个简单BST 65 * 5 66 * / \ 67 * / \ 68 * 3 6 69 * / \ 70 * / \ 71 * 2 4 72 * 73 * @return 74 */ 75 public TreeNode createBinSearchTree() { 76 TreeNode root = new TreeNode(5); 77 TreeNode node1 = new TreeNode(2); 78 TreeNode node2 = new TreeNode(3); 79 TreeNode node3 = new TreeNode(4); 80 TreeNode node4 = new TreeNode(6); 81 82 root.leftNode = node2; 83 root.rightNode = node4; 84 node2.leftNode = node1; 85 node2.rightNode = node3; 86 return root; 87 } 88 89 90 public static void main (String args[]) { 91 BinarySearchTree BST = new BinarySearchTree(); 92 TreeNode root = BST.createBinSearchTree(); 93 BST.preOrder(root); 94 System.out.println(); 95 root = BST.removeNode(root,3); 96 BST.preOrder(root); 97 } 98 99 100 /** 101 * 前序遍历 102 * @param root 103 */ 104 public void preOrder(TreeNode root) { 105 if (root == null) { 106 return; 107 } 108 System.out.print(root.val); 109 preOrder(root.leftNode); 110 preOrder(root.rightNode); 111 } 112 113 /** 114 * 中序遍历 115 * @param root 116 */ 117 public void inOrder(TreeNode root) { 118 if (root == null) { 119 return; 120 } 121 inOrder(root.leftNode); 122 System.out.print(root.val); 123 inOrder(root.rightNode); 124 } 125 126 127 /** 128 * 后序遍历 129 * @param root 130 */ 131 public void postOrder(TreeNode root) { 132 if (root == null) { 133 return; 134 } 135 postOrder(root.leftNode); 136 postOrder(root.rightNode); 137 System.out.print(root.val); 138 } 139 140 }
专注搬砖,擅长搬砖砸自己的脚~~~
Email:
ltwbuaa@163.com

浙公网安备 33010602011771号