树和二叉树总结—BST二叉排序树

Posted Arvon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树和二叉树总结—BST二叉排序树相关的知识,希望对你有一定的参考价值。

二叉排序树的特点:中序遍历是递增的…

下面复习几个常用的操作:

1.如何向BST中插入一个节点

思路:用递归做...
首先,判断head是否为空,为空就是需要插的地方;
然后,判断head的data是不是和新Node一样,一样就是重复Node,不加
最后,若比当前head.data小,则放到插到左节点的树你,否则就插到右节点

 

public static Node insertBST(Node root, Node keyNode) {
        if (root== null) { //如果遇到空的地方,就是该插入的地方...
            root= keyNode;
        } else { //如果节点不为空,则需要查找对应的位置,和二分法查找类似
            if (root.data == keyNode.data) { //找到一个同值得数,直接返回
                return root;
            } else if (keyNode.data < root.data) {
                root.left = insertBST(root.left, keyNode);
            } else {
                root.right = insertBST(root.right, keyNode);
            }
        }
        return root;
    }

 

2.如何创建BST

思路
  和给BST插值一样,逐步insert...
public static Node createBST(int[] arr) {
        Node root = null;
        for (int i = 0; i < arr.length; i++) {
            root = insertBST(root, new Node(arr[i]));
        }
        return root;
    }

 

3.判断一个树是不是二叉排序树

 

思路:
因为二叉排序树的中序遍历是递增有序序列,则可以利用这个特点,直接中序遍历二叉树,如果保证
前一个比后一个小,那么证明该树为一颗二叉排序树...

 

public static boolean judgeBst(Node root) {
        int preVal = 0;
        Node cur = root;
        Stack<Node> stack = new Stack<>();
        while (true) {
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }
            if (stack.isEmpty())
                break;
            cur = stack.pop();
            if (preVal > cur.data) {
                return false;
            } else {
                preVal = cur.data;
            }
            cur = cur.right;
        }
        return true;
    }

4.从BST中删除一个节点

思路:
  1.找到key
2.若key是叶子节点,直接删
3.若key只有左或右子树,直接隔过Node(key)接上其左或右子树...
4.若key既有左子树又有右子树,找到其左子树的最右边的节点rightest,用rightest代替key节点...然后接着从第二步开始判断如何把rightest删掉...
public static Node deleteNodeFromBST(Node root, int key) {
        if (root == null) return null;
        if (key < root.data) {
            root.left = deleteNodeFromBST(root.left, key);
        } else if (key > root.data) {
            root.right = deleteNodeFromBST(root.right, key);
        } else {
            //找到key
            if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            }
            //有左右子树的情况...
            Node tmp = root;
            //找到root左子树中最右边的那个Node, 这里只能从tmp去遍历
            root = findRightest(tmp.left);
            root.left = deleteRightest(tmp.left);
            root.right = tmp.right;
        }
        return root;
    }

    // 找到左子树中最右的那个Node,因为它是root左子树的最大值...
    private static Node findRightest(Node root) {
        if (root == null) return null;
        while (root.right != null) {
            root = root.right;
        }
        return root;
    }

    // 删除刚刚从发现的那个点(root左子树中最右边的那个rightest)
    // 因为是最右面的Node,则必然没有右子树
    private static Node deleteRightest(Node root) {
        if (root.right == null)
            return root.left;
        root.right = deleteRightest(root.right);
        return null;
    }

以上是关于树和二叉树总结—BST二叉排序树的主要内容,如果未能解决你的问题,请参考以下文章

树和二叉树知识点总结

C语言数据结构与算法-----树和二叉树全面总结(上)

图解数据结构树和二叉树全面总结

C语言数据结构与算法----树和二叉树全面总结(中)

树和二叉树学习笔记(21.10.26)

专题总结-二叉树