查找--二叉排序树

1.查询操作,查询是否有某一值

class TreeNode{
	TreeNode left;
	TreeNode right;
	int  val;
}
public static boolean search(TreeNode root,int key,TreeNode parent,TreeNode out) {
		if(root==null) {//查询失败
			out=parent;
			return false;
		}
		if(key==root.val) {
			out=root;
			return true;
		}
		if(key<root.val) {
			return search(root.left,key,root,out);
		}
		if(key>root.val) {
			return search(root.right, key, parent, out);
		}
		return false;
	}

2.二叉树插入节点

public boolean insert(TreeNode root,int key) 
	{
		TreeNode leaf=new TreeNode();//对key作查询之后定位到的叶子节点
		if(!search(root, key, null, leaf)) 
		{//不存在值等于key的节点
			TreeNode sNode=new TreeNode();
			sNode.val=key;
			sNode.left=null;
			sNode.right=null;
			if(leaf==null) {
				root=sNode;//假如原树为空,即root==null
			}
			if(key<leaf.val) {
				leaf.left=sNode;
			}else {
				leaf.right=sNode;
			}
			return true;
		}else
		{
			//已存在该节点
			return false;
		}
	}

3.删除节点
删除情况分为三种:
(1)删除点为叶子节点,直接删除。
(2)删除节点只有左子树或只有右子树,独子节点继承父节点。
(3)删除节点左右子树都存在。思路:找到删除节点的最大前驱或者最小后继来替换该节点。即找到该节点左子树的最大值或者找到该节点右子树的最小值。该点的位置不变,****只是把该点的值变成最大前驱或最小后继的值,实际 上删除的点为他的最大前驱或最小后继

/*
假设P为要删除的点
*/
public static void delete(TreeNode P) {
		TreeNode Q=new TreeNode();
		TreeNode S=new TreeNode();
		if(P.right==null)
		{//右子树为空,则直接左子树子承父业
			Q=P.left;
			if(P.val<P.parent.val) {//判断原节点是父节点的左树还是右树
				P.parent.left=Q;
			}else {
				P.parent.right=Q;
			}
		}else if(P.left==null)
		{
			Q=P.right;
			if(P.val<P.parent.val) {//判断原节点是父节点的左树还是右树
				P.parent.left=Q;
			}else {
				P.parent.right=Q;
			}
		}else //左右都不为空,去找最大前驱
		{
			Q=P;
			S=P.left;
			while(S.right!=null) {
				Q=S;
				S=S.right;
			}
			//将S的值赋给P
			P.val=S.val;
			if(P!=Q)
			{//重接Q的右子树
				Q.right=S.left;
			}else
			{//重接Q的左子树
				Q.left=S.left;
			}
		}
	}

删除示意图,(参考大话数据结构P325)
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44315921/article/details/86515793