二叉查找樹中刪除一個節點


import java.util.Stack;

/**
 * @Author JH
 * @CreateDate 18-6-11
 * @Description 在二叉查找樹中刪除一個節點
 * 1.如果該節點是葉子節點 刪除該節點
 * 2.如果該節點有左子樹 將左子樹的根節點代替該節點
 * 3.如果該節點只有右子樹 將右子樹根節點代替該節點
 * 4.既有左節點又有右節點,用右節點代替該節點 將左節點放在右節點的左子樹的最左邊
 */
class TreeNode{
    TreeNode left;
    TreeNode right;
    int val;

    public TreeNode( int val) {
        this.left = null;
        this.right = null;
        this.val = val;
    }
}
public class DeleteNodeInBST {
    public boolean delete(TreeNode root,int key){
        Stack<TreeNode> stack=new Stack<TreeNode>();
        TreeNode p=root,q;
        while(p!=null){
            System.out.println(p.val);
            stack.push(p);
            if (p.val==key){
                //刪除節點的左右子樹都爲空 直接將父節點的該左子樹或者右子樹置空
                if (p.left==null&&p.right==null){
                    System.out.println(" p.left==null&&p.right==null"+p.val);
                    if(!stack.isEmpty()){
                        stack.pop();
                      q=stack.peek();
                      if (q.left==p){
                          q.left=null;
                          return true;
                      }else{
                          q.right=null;
                          return true;
                      }
                    }else{
                        return false;
                    }
                    //左子樹爲空 將右子樹直接放到父節點的刪除節點位置上
                }else if (p.left==null&&p.right!=null){
                    System.out.println(" p.left==null&&p.right!=null"+p.val);
                    if (!stack.isEmpty()){
                        stack.pop();
                        q=stack.peek();
                        if (q.left==p){
                            q.left=p.right;
                        }else {
                            q.right=p.right;
                        }
                    }else {
                        return false;
                    }
                    //右子樹爲空 左子樹放到該節點位置上
                }else if(p.left!=null&&p.right==null){
                    System.out.println(" p.left!=null&&p.right==null"+p.val);
                    if (!stack.isEmpty()){
                        stack.pop();
                        q=stack.peek();
                        if (q.left==p){
                            q.left=p.left;
                        }else {
                            q.right=p.left;
                        }
                        return true;
                    }else {
                        return false;
                    }
                }else {
                    //左右子樹都不爲空 將左子樹節點放到右子樹的最左邊
                    System.out.println(" p.left!=null&&p.right!=null"+p.val);
                    TreeNode n=p.right;
                    while (n.left!=null){
                        n=n.left;
                    }
                    if (!stack.isEmpty()){
                        stack.pop();
                        q=stack.peek();
                        if (q.left==p){
                            q.left=p.right;
                            n.left=p.left;
                        }else {
                            q.right=p.right;
                            n.left=p.left;
                        }
                        return true;
                    }else {
                        return false;
                    }

                }
            }else {
                if (p.val>key){
                    p=p.left;
                }else {
                    p=p.right;
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        TreeNode t1=new TreeNode(20);
        TreeNode t2=new TreeNode(10);
        TreeNode t3=new TreeNode(5);
        TreeNode t4=new TreeNode(3);
        TreeNode t5=new TreeNode(8);
        TreeNode t6=new TreeNode(7);
        TreeNode t7=new TreeNode(9);
        TreeNode t8=new TreeNode(15);
        TreeNode t9=new TreeNode(17);
        TreeNode t10=new TreeNode(40);
        TreeNode t11=new TreeNode(13);
        t1.left=t2;
        t1.right=t10;
        t2.left=t3;
        t2.right=t8;
        t8.left=t11;
        t8.right=t9;
        t3.left=t4;
        t3.right=t5;
        t5.left=t6;
        t5.right=t7;
        DeleteNodeInBST d=new DeleteNodeInBST();
        System.out.println(d.delete(t1,5) );
        System.out.println(d.delete(t1,9) );
        System.out.println(d.delete(t1,3) );

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章