51 # 二叉搜索树的实现

简介: 51 # 二叉搜索树的实现

实现二叉搜索树

比如我们有数组:

[10, 8, 19, 6, 15, 22, 20]

需要把数组转为二叉搜索树,效果如下:

// 节点
class Node {
    constructor(element, parent) {
        this.element = element; // 存的数据
        this.parent = parent; // 父节点
        this.left = null; // 左子树
        this.right = null; // 右子树
    }
}
class BST {
    constructor(compare) {
        this.root = null;
        this.size = 0; // 节点个数
        this.compare = compare || this.compare;
    }
    compare(e1, e2) {
        return e1 - e2;
    }
    // 添加节点
    add(element) {
        // 如果根元素不存在
        if (this.root === null) {
            this.root = new Node(element, null);
            this.size++;
            return;
        } else {
            // 如果根元素存在,那么增加的就不是根节点,需要找到 parent
            let currentNode = this.root;
            // 当前比较的结果
            let compare = 0;
            // 先找到需要对比的 parent(当前父节点)
            let parent = null;
            while (currentNode) {
                parent = currentNode;
                compare = this.compare(element, currentNode.element);
                // 如果大于 0 找右树,小于 0 找左树
                if (compare > 0) {
                    currentNode = currentNode.right;
                } else if (compare < 0) {
                    currentNode = currentNode.left;
                } else {
                    // 如果比较后结果一样,由自己决定是否需要覆盖
                    currentNode.element = element; // 覆盖
                    return;
                }
            }
            // 找到了 parent,生成新节点
            let newNode = new Node(element, parent);
            if (compare > 0) {
                parent.right = newNode;
            } else {
                parent.left = newNode;
            }
        }
    }
}
let bst = new BST();
let arr = [10, 8, 19, 6, 15, 22, 20];
arr.forEach((element) => {
    bst.add(element);
});
console.dir(bst.root, { depth: 100 });

自定义比较器:

let bst = new BST((e1, e2) => {
    return e1.age - e2.age;
});
let arr = [
    {
        name: "凯",
        age: 3
    },
    {
        name: "小",
        age: 1
    },
    {
        name: "默",
        age: 3
    },
    {
        name: "的",
        age: 6
    },
    {
        name: "博",
        age: 7
    },
    {
        name: "客",
        age: 8
    }
];
arr.forEach((element) => {
    bst.add(element);
});
console.dir(bst.root, { depth: 100 });

由于我们判断的时候用了覆盖,可以看到 这个节点被 覆盖了

目录
相关文章
|
6月前
二叉搜索树
二叉搜索树
28 2
|
5月前
|
C++
【c++】二叉搜索树
【c++】二叉搜索树
33 0
|
6月前
|
存储 安全 C++
C++【二叉搜索树】
C++【二叉搜索树】
60 0
|
存储 算法 关系型数据库
有了二叉树,平衡二叉树为什么还需要红黑树
有了二叉树,平衡二叉树为什么还需要红黑树
100 0
有了二叉树,平衡二叉树为什么还需要红黑树
|
算法 JavaScript 前端开发
|
存储 算法
|
编译器 C语言 C++
【C++】二叉搜索树
【C++】二叉搜索树
71 0
|
存储
【二叉搜索树】
【二叉搜索树】
46 0
|
算法
二叉搜索树、平衡二叉树
一、二叉搜索树 这里我们不用太多书面化的语言来定义,笔者认为在讨论数据结构、算法相关的内容时用太多书面化、学术化的语言是一种让人很烦的事情。咬文嚼字,不便于读者理解。 简单来说二叉树搜索树,其实就是用来做二分查找的一种二叉树。 特点是:根节点的左子树值均小于根节点的值,根节点的右子树值均大于根节点的值。 比如123 4 567建树的结果就是
55 0