• js数据结构之二叉树的详细实现方法


    数据结构中,二叉树的使用频率非常高,这得益于二叉树优秀的性能。

    二叉树是非线性的数据结构,用以存储带有层级的数据,其用于查找的删除的性能非常高。

    二叉树 数据结构的实现方法如下:

    function Node (data, left, right) {
        this.data = data;
        this.left = left;
        this.right = right;
        this.show = function () {
            return this.data;
        };
    }
    
    
    function BST () {
        this.root = null;
        this.insert = function (data) {
            var node = new Node(data, null, null);
            if (this.root === null) {
                this.root = node;
            } else {
                var current = this.root;
                var parent;
                while (true) {
                    parent = current;
                    if (data < current.data) {
                        current = current.left;
                        if (current === null) {
                            parent.left = node;
                            break;
                        }
                    } else {
                        current = current.right;
                        if(current === null) {
                            parent.right = node;
                            break;
                        }
                    }
                }
            }
        };
        // 中序遍历
        this.inOrder = function (node) {
            if (node !== null) {
                this.inOrder(node.left);
                console.log(node.show());
                this.inOrder(node.right);
            }
        };
        // 先序遍历
        this.preOrder = function (node) {
            if (node !== null) {
                console.log(node.show());
                this.preOrder(node.left);
                this.preOrder(node.right);
            }
        };
        // 后序遍历
        this.afterOrder = function (node) {
            if (node !== null) {
                this.afterOrder(node.left);
                this.afterOrder(node.right);
                console.log(node.show());
            }
        };
    
        this.getMin = function () {
            var current = this.root;
            while (current.left !== null) {
                current = current.left;
            }
            return current.data;
        };
    
    
        this.getMax = function () {
            var current = this.root;
            while (current.right !== null) {
                current = current.right;
            }
            return current.data;
        };
    
        this.find = function (data) {
            var current = this.root;
            while (current !== null) {
                if (data < current.data) {
                    current = current.left;
                } else if (data > current.data) {
                    current = current.right;
                } else {
                    return current;
                }
            }
            return null;
        };
    
        
    
        this.remove = function (data) {
            this.root = this._removeNode(this.root, data); //将根节点转换
        };
    
        this._getSmallest = function (node) {
            while(node.left!=null){
                node=node.left;
            }
            return node;
        };
    
    
        this._removeNode = function (node, data) {
            if (node === null) {
                return null;
            }
            if (data === node.data) {
                // 如果没有子节点
                if (node.right === null && node.left === null) {
                    return null;
                }
                // 如果没有左子节点
                if (node.left === null) {
                    return node.right;//直接指向其右节点
                }
                // 如果没有右子节点
                if (node.right === null) {
                    return node.left;
                }
                // 如果有两个节点
                if (node.right !== null && node.left !== null) {
                    var tempNode = this._getSmallest(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;
            }
        };
    }

    二叉树  数据结构的使用方法如下:

    var bst = new BST ();
    bst.insert(40);
    bst.insert(20);
    bst.insert(70);
    bst.insert(60);
    bst.insert(75);
    bst.insert(71);
    bst.insert(73);
    
    bst.inOrder(bst.root);
    bst.remove(70);
    console.log("----------------");
    bst.inOrder(bst.root);
    console.log("----------------");
    console.log(bst.find(73))
  • 相关阅读:
    OpenGL模板缓冲区与模板测试
    u3d调用c++ dll的DllNotFoundExceion 问题
    u3d调用自己的dll
    使用 idea 的Bookmarks(书签)功能
    maven 相关问题
    项目
    使用 vi/vim 时,粘贴进新创建文件或空文件的首行内容丢失的解决方法
    Thread.sleep还是TimeUnit.SECONDS.sleep
    搭建 Guacamole 并解决各种坑和创建不了虚拟驱动器导致无法实现文件传输的方法
    properJavaRDP 跑通本地远程桌面
  • 原文地址:https://www.cnblogs.com/pomelott/p/9478279.html
Copyright © 2020-2023  润新知