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)