新建文件
创建TreeNode类,实例化
直接在BinarySearchTree类里面写就可以
static class TreeNode {public int key;public TreeNode left;public TreeNode right;TreeNode(int key) {this.key = key;}}public TreeNode root;
插入节点 insert
public boolean insert(int key) {TreeNode node = new TreeNode(key);if(root==null){//检查是否为空树root=node;return true;//表示成功插入}TreeNode cur=root;//读取根节点TreeNode parent=null;//查找合适的位置 如果已经有了则返回falsewhile(cur!=null){if(cur.key<key){parent=cur;cur=cur.right;} else if (cur.key>key) {parent=cur;cur=cur.left;}else{return false;}}//插入if(key< parent.key){parent.left=node;}else{parent.right=node;}return true;}
查找结点 search
找到则返回该节点,没找到返回null
public TreeNode search(int key) {if(root==null) return null;TreeNode cur=root;while(cur!=null){if(cur.key==key){return cur;}else if(cur.key>key){cur=cur.left;}else{cur=cur.right;}}return null;}
删除节点 remove
找到节点并删除,成功则返回true,失败false
public boolean remove(int key) {TreeNode cur=root;TreeNode parent=null;while(cur!=null){if(cur.key<key){parent=cur;cur=cur.right;} else if (cur.key>key) {parent=cur;cur=cur.left;}else{removeNode(parent,cur);//进行删除return true;}}return false;}
注意,这里删除又写了一个自定义函数。已至删除的位置和其双亲结点,如何让其删除呢?
如果左右子节点都在,则用左子树的最大值或者右子树的最小值替换即可,下面给出用右子树的最小值替换的方法。
public void removeNode(TreeNode parent,TreeNode cur){//在子树部分删除cur节点后重新构建子搜索二叉数if(cur.left==null){if(cur==root) root=cur.right;if(cur==parent.left) parent.left=cur.right;if(cur==parent.right) parent.right=cur.right;}else if(cur.right==null){if(cur==root) root=cur.left;if(cur==parent.left) parent.left=cur.left;if(cur==parent.right) parent.right=cur.left;}else{TreeNode target=cur.right;TreeNode targetParent=cur;while(target.left!=null){targetParent=target;target=target.left;}cur.key= target.key;if(target==targetParent.left) {targetParent.left = target.right;}else{targetParent.right = target.right;}}}
如有什么没讲清楚的地方,欢迎留言探讨!