JS实现常见数据结构:二叉树

绪论

树的特点: 多层非线性数据结构。进行插入或搜索时很快。
树的方法:

  1. add:向树中插入一个节点。
  2. findMin:查找树中最小的节点。
  3. findMax:查找树中最大的节点。
  4. find:查找树中某个节点。
  5. isPresent:判断树中是否存在某个节点。
  6. remove:移除树中的某个节点。

正文

<!DOCTYPE html>
<div lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>index</title>
    <script src="js/jquery-2.2.4.min.js"></script>
    <style>
       
    </style>
</head>

<body>

</body>
<script>

    $(document).ready(function () {
        var tree = new MyTree();
        tree.add(9);
        tree.add(4);
        tree.add(15);
        tree.add(2);
        tree.add(3);
        tree.add(1);
        tree.add(6);
        tree.add(5);
        tree.add(8);
        tree.add(7);
        tree.add(17);
        tree.add(10);
        tree.add(11);

        tree.show();

        console.log('最小值' + tree.findMin());
        console.log('最大值' + tree.findMax());
        console.log('8是否存在' + tree.isPresent(8));
        tree.remove(1);
        console.log('最小值' + tree.findMin());
        tree.remove(9);
        console.log('9是否存在' + tree.isPresent(9));
        tree.show();

    });

    // 树的节点信息
    function Node(data, left = null, right = null) {
        this.data = data;
        this.left = left;
        this.right = right;
    }

    function MyTree() {
        // 根节点
        this.root = null;

        // 向树中插入一个节点
        this.add = function(v) {
            if (v === null || v === undefined) {
                return false;
            }

            var node = this.root;
            // 判断根节点是否有值
            if (node === null) {
                this.root = new Node(v);
                return true;
            } else {
                var searchTree = function(n) {
                    // 与根节点进行比较
                    if (v < n.data) {
                        if (n.left === null) {
                            n.left = new Node(v);
                            return true;
                        } else {
                            return searchTree(n.left);
                        }
                    } else if (v > n.data) {
                        if (n.right === null) {
                            n.right = new Node(v);
                            return true;
                        } else {
                            return searchTree(n.right);
                        }
                    } else {
                        return false;
                    }
                };
                return searchTree(node);
            }
        };

        // 查找树中最小的节点
        this.findMin = function() {
            var node = this.root;
            while(node.left !== null) {
                node = node.left;
            }
            return node.data;
        };

        // 查找树中最大的节点
        this.findMax = function() {
            var node = this.root;
            while(node.right !== null) {
                node = node.right;
            }
            return node.data;
        };

        // 查找树中某个节点
        this.find = function(v) {
            var node = this.root;
            while (node.data !== v) {
                if (v < node.data) {
                    node = node.left;
                } else {
                    node = node.right;
                }
                if (node === null) {
                    return null;
                }
            }
            return node;
        };

        // 判断树中是否存在某个节点
        this.isPresent = function(v) {
            var node = this.root;
            while (node !== null) {
                if (node.data === v) {
                    return true;
                }
                if (v < node.data) {
                    node = node.left;
                } else {
                    node = node.right;
                }
            }
            return false;
        };

        // 移除树中的某个节点
        this.remove = function(v) {
            var removeNode = function(n, v) {
                if (n === null) {
                    return null;
                }
                if (v === n.data) {
                    // 没有子节点
                    if (n.left === null && n.right === null) {
                        return null;
                    }
                    // 没有左侧子节点
                    if (n.left === null) {
                        return n.right;
                    }
                    // 没有右侧子节点
                    if (n.right === null) {
                        return n.left;
                    }
                    // 有两个子节点,像删除根节点一样,去右侧树中找最小值,把这个最小值当成根节点,
                    // 再次调用删除方法,把刚获取的最小值在右侧树中删除掉
                    var tempNode = n.right;
                    while (tempNode.left !== null) {
                        tempNode = tempNode.left;
                    }
                    n.data = tempNode.data;
                    n.right = removeNode(n.right, tempNode.data);
                    return n;
                } else if (v < n.data) {
                    n.left = removeNode(n.left, v);
                    return n;
                } else {
                    n.right = removeNode(n.right, v);
                    return n;
                }
            };
            this.root = removeNode(this.root, v);
        };

        // 展示
        this.show = function() {
            var arr = [];
            var myShow = function(n) {
                if (n !== null) {
                    arr.push(n.data);
                    if (n.left !== null) {
                        myShow(n.left);
                    }
                    if (n.right !== null) {
                        myShow(n.right);
                    }
                }
            };
            myShow(this.root);
            console.log(arr.join(' -> '));
        };
    }

</script>

</div>

结果

在这里插入图片描述
(若有什么错误,请留言指正,3Q)

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