二叉排序树的插入和删除

插入

递归的寻找插入的位置。

public static TreeNode Insert(int x, TreeNode t) {

        if (t == null) {
            TreeNode n = new TreeNode(x);
            n.left = null;
            n.right = null;
            t = n;
        }

        else if (x < t.val)
            t.left = Insert(x, t.left);
        else if (x > t.val)
            t.right = Insert(x, t.right);
        // 如果x已经在tree中了,则什么也不做;

        return t;
    }

删除

  • 节点是一个叶节点,直接删除;
  • 节点有一个儿子,可以在其父节点调整指针绕过该节点被删除;
  • 节点有两个儿子,用其右子树中的最小数据代替该节点的数据并递归的删除这个节点。
public static TreeNode Delete(int x, TreeNode t) {

        if (t == null) {
            System.out.println("element is null");
        }

        else if (x < t.val)
            t.left = Delete(x, t.left);
        else if (x > t.val)
            t.right = Delete(x, t.right);

        //找到节点并有左右两个子树
        else if (t.left != null && t.right != null) {
            TreeNode temp = FindMin(t.right);
            t.val = temp.val;
            t.right = Delete(t.val, t.right);
        } 

        //有0个或1个子树的时候
        else {
            TreeNode temp = t;
            if (t.left == null)   //同时处理0个子树和只有右子树的情形;
                t = t.right;
            else if (t.right == null)
                t = t.left;
        }
        return t;
    }

    public static TreeNode FindMin(TreeNode t) {
        if (t.left != null)
            return FindMin(t.left);
        else
            return t;
    }

例子

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}
public class BinaryTree {

    public static void main(String[] args) {

        TreeNode tree = CreateTree();
        dfs(tree);

//       插入
         TreeNode t = Insert(5, tree);
         dfs(t);
//       删除
        t = Delete(2, tree);
        dfs(t);

    }

    public static TreeNode Delete(int x, TreeNode t) {

        if (t == null) {
            System.out.println("element is null");
        }

        else if (x < t.val)
            t.left = Delete(x, t.left);
        else if (x > t.val)
            t.right = Delete(x, t.right);

        //找到节点并有左右两个子树
        else if (t.left != null && t.right != null) {
            TreeNode temp = FindMin(t.right);
            t.val = temp.val;
            t.right = Delete(t.val, t.right);
        } 

        //有0个或1个子树的时候
        else {
            TreeNode temp = t;
            if (t.left == null)   //同时处理0个子树和只有右子树的情形;
                t = t.right;
            else if (t.right == null)
                t = t.left;
        }
        return t;
    }

    public static TreeNode FindMin(TreeNode t) {
        if (t.left != null)
            return FindMin(t.left);
        else
            return t;

    }


    public static TreeNode Insert(int x, TreeNode t) {

        if (t == null) {
            TreeNode n = new TreeNode(x);
            n.left = null;
            n.right = null;
            t = n;
        }

        else if (x < t.val)
            t.left = Insert(x, t.left);
        else if (x > t.val)
            t.right = Insert(x, t.right);
        // 如果x已经在tree中了,则什么也不做;

        return t;
    }

    public static TreeNode CreateTree() {

        TreeNode t1 = new TreeNode(6);
        TreeNode t2 = new TreeNode(2);
        TreeNode t3 = new TreeNode(8);
        TreeNode t4 = new TreeNode(1);
        TreeNode t5 = new TreeNode(4);
        TreeNode t6 = new TreeNode(3);

        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = t5;
        t5.left = t6;

        return t1;
    }

    // 深度优先遍历
    public static void dfs(TreeNode root) {
        if (root == null) {
            return;
        }

        System.out.println(root.val);

        dfs(root.left);
        dfs(root.right);
    }
}

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值