美文网首页
二叉树和二叉查找树

二叉树和二叉查找树

作者: hhooke | 来源:发表于2018-08-30 15:46 被阅读0次

树是一种非线性的数据结构,以分层的方式存储数据。树被用来存储具有层级关系的数据,比如文件系统中的文件;树还被用来存储有序列表。

树的定义

树由一组以边连接的节点组成。公司的组织结构图就是一个树的例子,参见图下

先序遍历 :

function preOrder(node) {
    if (node != null) {
        console.log(node.show() + " ");
        preOrder(node.left);
        preOrder(node.right);
    }
}

后序遍历 :

function postOrder(node) {
    if (!(node == null)) {
        postOrder(node.left);
        postOrder(node.right);
        console.log(node.show() + " ");
    }
}

查找最大值和最小值

即找到最左边的节点和最右边的节点

    getMin() {
        let current = this.root;
        while (true) {
            if (current.left !== null) {
                current = current.left
            } else {
                break;
            }
        }
        return current.data;
    }
    getMax() {
        let current = this.root;
        while (true) {
            if (current.right !== null) {
                current = current.right
            } else {
                break;
            }
        }
        return current.data;
    }

从二叉查找树上删除节点

这里比较复杂,我们要边看代码边画图来讲解。

remove(data) {
    this.root = this.removeNode(this.root, data);
}
removeNode(node, data) {
    if (node == null) return null;

    if (data == node.data) {
        if (node.left == null && node.right == null) return null;
        // 没有左子节点的节点
        if (node.left == null) return node.right;
        // 没有右子节点的节点
        if (node.right == null) return node.left;
        // 有两个子节点的节点
        var tempNode = this.getMin(node.right);
        node.data = tempNode.data;
        node.right = this.removeNode(node.right, tempNode.data);
        return node;
    } else if (data < node.data) {
        node.left = this.removeNode(node.left, data);
        return node;
    } else {
        node.right = this.removeNode(node.right, data);
        return node;
    }
}

首先我们构建一个这样子的二叉树

bst.insert(15);
bst.insert(10);
bst.insert(12);
bst.insert(5);
bst.insert(8);
bst.insert(11);
bst.insert(14);
bst.insert(7);
bst.insert(4);
bst.insert(13);

bst.remove(10)

首先我们要删除10的节点,因为10节点的left已经有节点了,右边也有节点了,右边节点的数值肯定是比左边大的,所以我们在右边找到最小的节点,将这个最小的节点data复制给当前的10。此时10节点被11覆盖,但是原来的11还存在与树中,所以我们此时要删除11节点,按照之前的方法再进行查找一次,知道运行结束。

相关文章

  • 6. 二叉树创建-查找

    1. 递归方式实现二叉树的构建2. 树、二叉树、二叉查找树3. 二叉树排序树的理解4. 二叉查找树5. 二叉树的查找

  • 二叉查找树的查找和排序方法的实现

    定义二叉树 二叉查找树的查找和排序方法的实现

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 数据结构3:二叉树详细介绍

    9.二叉树 9.1 二叉树的定义 9.2 满二叉树与完全二叉树 9.3 二叉查找树(也叫二叉搜索树,二...

  • 数据结构——二叉查找树(C语言)

    二叉查找树,也称作二叉搜索树,有序二叉树,排序二叉树,而当一棵空树或者具有下列性质的二叉树,就可以被定义为二叉查找...

  • 极客时间数据结构与算法之美笔记25~26

    二叉树到二叉查找树,是为了查找数据的效率接近logN。 二叉查找树到平衡二叉查找树,是为了防止二叉查找树沦为链表。...

  • 24| 二叉树基础(下)

    上一节我们学习了树、二叉树以及二叉树的遍历,今天我们再来学习一种特殊的的二叉树,二叉查找树。二叉查找树最大的特点就...

  • 二叉树查找与节点删除的javascript实现

    前言 紧接前面说过的 二叉树的实现 和 二叉树的遍历,今天来说一下用javascript实现二叉树的查找和节点删除...

网友评论

      本文标题:二叉树和二叉查找树

      本文链接:https://www.haomeiwen.com/subject/pwtlwftx.html