public class BinarySearchTree { //二叉搜说树代码实现 static class TreeNode { public int key; public TreeNode left; public TreeNode right; TreeNode(int key) { this.key = key; } } public TreeNode root; /** * 插入一个元素 * @param key */ public boolean insert(int key) { if(root==null){ root=new TreeNode(key); } TreeNode cur=root; TreeNode parent=null; while(cur!=null){ if(cur.key<key){ parent=cur; cur=cur.right; }else if(cur.key==key){ return true; } else{ parent=cur; cur=cur.left; } } return true; } //查找key是否存在 public TreeNode search(int key) { TreeNode cur=root; while(cur!=null){ if(cur.key<key){ cur=cur.right; }else if(cur.key==key){ return cur; }else{ cur=cur.left; } } return null; } //删除key的值 public boolean remove(int key) { TreeNode cur = root; TreeNode parent = null; while (cur != null) { if(cur.key == key) { removeNode(parent,cur); return true; }else if(cur.key < key) { parent = cur; cur = cur.right; }else { parent = cur; cur = cur.left; } } return false; } private void removeNode(TreeNode parent, TreeNode cur) { //1cur.left==null //cur为删除的结点,且cur是根结点, // if(cur.left==null){ if(cur==root){ root=root.right; }else if(parent.left==cur){//cur不是根节点 parent.left=cur.right; }else{ parent.right=cur.right; } } if(cur.right==null){ if(cur==root){ root=root.left; }else if(parent.left==null){ parent.left=cur.left; }else{ parent.right=cur.left; } } if(cur.left!=null&&cur.right!=null){ //需要使用替换删除 TreeNode target=cur.right; TreeNode targetP=cur; while(target.left!=null){ targetP=target; target=target.left; } cur.key=target.key; if(target == targetP.left) { targetP.left = target.right; }else { targetP.right = target.right; } } } }
今天由于时间紧迫,我先写一个代码版的,之后再写这个分析版的哈