- 如何搜索
- 构建一颗二叉搜索树
- 插入
- 删除
如何搜索
在二叉搜索树里搜索值;搜索非常类似于二分查找
//查找key是否存在public TreeNode search(int key) {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;}
最好的情况是这颗搜索树是一个完全二叉树;时间复杂度O(log n);最坏情况是单边的树;时间复杂度O(N)
构建一颗二叉搜索树
假设给你一串没有重复的数字;你如何构建出一棵搜索树?
插入
第一次插入的节点是根节点;其次每个节点都是在叶子节点的位置插入;cur从根节点开始走;cur为空的时候就是我们插入的时候,定义一个parent记录cur父亲的位置(因为我们cur只是找到空的节点;虽然我们是一步一步比较下来;但是走下来;我们得记录cur是从哪个节点走下来的;知道它的父亲才能插入)
public boolean insert(int key) {if(root == null) {//没有节点的时候得注意;直接插入根节点就行root = new TreeNode(key);}TreeNode prev = null;TreeNode cur = root;while(cur != null) { //找位置if(cur.val == key) {//值相同时不给插入return false;}else if(cur.val > key) {prev = cur;cur = cur.left;}else { prev = cur;cur = cur.right;}}//上述找到cur为空;但是不知道是左边还是右边走下来空了;所以我们需要和父亲比较一下if(prev.val > key) {prev.left = new TreeNode(key);}else {prev.right = new TreeNode(key);}return true;}
删除
假设:删除结点为 cur, 待删除结点的双亲结点为 parent
删除分三种情况:
大前提1:cur.left==null ;左边没有树
1:删除根节点;cur是root;删除方案root=cur.right。
2:删除上一个根节点的左孩子
cur是parent.left;删除方案parent.left=cur.right
3:cur 是 parent.right, 删除方案parent.right = cur.right
实现:
找位置先;
大前提2:cur.right==null ;右边没有树
1:删除根节点;删除方案root=cur.left
2:cur 是 parent.left,删除方案parent.left = cur.left
3:cur是patent.right;解决方案parent.right=cur.left
大前提3:左右都不为空;例如删除12
第三种并不是真正意义上的删除;两种方式,找到左边的最大值,或者右边的最小值。也就是左边的最右,或者右边的最左。9或者13.(然后一步一步找到这个位置,把我的12改成13或者9)然后再让这个9等于它自己的右边,或者13等于13的左边。这样这个节点就变为空了.
如果:右边的左为空,只有右。就直接把25给12,然后25指向16,删除这个重复的25,
整体代码:
public void removeNode(TreeNode preant,TreeNode cur){if(cur.left==null){if(cur==root){root=cur.right;}else if(cur==preant.left){preant.left=cur.right;}else {preant.right=cur.right;}} else if(cur.right==null){if(cur==root){root=cur.left;}else if(cur==preant.left){preant.left=cur.left;}else {preant.right=cur.left;}}else {//两边都不为空TreeNode target=cur.right;TreeNode targetParent=cur;while (target.left!=null){targetParent=target;target=target.left;}cur.val=target.val;if(target==targetParent.left) {targetParent.left = target.right;}else {targetParent.right=target.right;}}}