二叉搜索树删除指定节点实现

若要删除一个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 }

 



posted @ 2018-08-06 20:05  一介草民李八千  阅读(330)  评论(0)    收藏  举报