zoukankan      html  css  js  c++  java
  • 二叉查找树

    // 实现二叉查找树
    function BinaryTree() {
        this.root = null;
        this.node = function (value) {return {value: value, left: null, right: null}};
        this.add  = function (value) {
            if (this.root === null) {
                this.root = this.node(value);
            }
            else {
                var current = this.root;
                var parent;
    
                while (true) {
                    parent = current;
                    if (value < current.value) {
                        current = current.left;
                        if (current === null) {
                            parent.left = this.node(value);
                            break;
                        }
                    }
                    else {
                        current = current.right;
                        if (current === null) {
                            parent.right = this.node(value);
                            break;
                        }
                    }
                }
            }
        };
    }
    
    
    // 遍历查找,从左到右
    function inOrder(node) {
        if (node !== null) {
            inOrder(node.left);
            inOrder(node.right);
        }
    }
    
    
    // 查找最小值
    function getMin(node) {
        while (node.left !== null) {
            node = node.left;
        }
        return node.value;
    }
    
    
    // 查找最大值
    function getMax(node) {
        while (node.right !== null) {
            node = node.right;
        }
        return node.value;
    }
    
    
    // 查找指定值
    function find(node, value) {
        while (node !== null) {
            if (value === node.value) {
                return true;
            }
            else {
                node = value < node.value ? node.left : node.right;
            }
        }
        return false;
    }
    
    
    // 删除节点
    function remove(node, value, type) {
        if (node === null) return null;
        if (value === node.value) {
            if (node.left === null && node.right === null) return null;
            if (node.left === null) return node.right;
            if (node.right === null) return node.left;
            if (typeof type !== 'undefined') {
                if (type === 'getMax') {
                    node.value = getMax(node.right);
                    node.right = remove(node.right, node.value);
                }
                else {
                    node.value = getMin(node.left);
                    node.left  = remove(node.left, node.value);
                }
            }
            else {
                node.value = getMin(node.right);
                node.right = remove(node.right, node.value);
            }
        }
        else {
            value < node.value ? node.left = remove(node.left, value, 'getMax') : node.right = remove(node.right, value, 'getMin');
        }
        return node;
    }

     

    var obj = new BinaryTree();
      obj.add(0);
      obj.add(2);
      obj.add(1);
      obj.add(3);
      obj.add(4);
      obj.add(8);
      obj.add(1);
      obj.add(-3);
      obj.add(-2);
      obj.add(-7);
      obj.add(-22);
      obj.add(-1);
      obj.add(-3);
      obj.add(-1);

  • 相关阅读:
    应用js改变问章字体大小
    在北京实习的日子
    php算法
    SQL Server 查询处理中的各个阶段(SQL执行顺序)
    130 个你需要了解的 vim 命令
    分享一个检测用户是否用手机(Mobile)访问网站的 PHP 类
    使用apache自带日志分割模块rotatelogs,分割日志
    centos下lvs配置
    分享codeigniter框架,在zend studio 环境下的代码提示
    vi 常用命令
  • 原文地址:https://www.cnblogs.com/shanchenba/p/5664419.html
Copyright © 2011-2022 走看看