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

      二叉树的特点:

          像一颗树一样,从顶端往下延伸,最顶端的为根节点,每个节点下面子节点的数不超过两个,没有任何子节点的节点被称为叶子节点, 除了根节点和叶子节点的被称为中间节点。

      二叉查找树:

        每个节点的左子节点比 自身的值小, 又子节点比自身的值大。

      

        class Node {
            constructor(key) {
                this.key = key;
                this.left = null;
                this.right = null;
            }
        }
    
    
        class BinaryTree{
            constructor() {
                this.root = null;
            }
    
    
            insert(key) {     // 插入数据
                var newNode = new Node(key);
                if (this.root == null) {
                    this.root = newNode;
                } else {
                    var current = this.root;
                    while( true) {
                        if (key < current.key) {
                            if (current.left) {
                                current = current.left;
                            } else {
                                current.left = newNode;
                                break;
                            }
                        } else if (key > current.key) {
                            if (current.right) {
                                current = current.right;
                            } else {
                                current.right = newNode;
                                break;
                            }
                        }
                    }
                }
            }
    
    
            centerSort(node,arr = []) {        // 中序排列
                if (node) {
                    this.centerSort(node.left, arr);
                    arr.push(node.key);
                    this.centerSort(node.right,arr);
                }
                return arr;
            }
    
            prevSort(node, arr= []) {           // 前序排列
                if (node) {
                    arr.push(node.key);
                    this.prevSort(node.left, arr);
                    this.prevSort(node.right, arr);
                }
                return arr;
            }
    
            nextSort(node, arr = []) {               // 后续排列
                if (node) {
                    this.nextSort(node.left, arr);
                    this.nextSort(node.right, arr);
                    arr.push(node.key);
                }
                return arr;
            }
    
            getMin(node) {                // 获取二叉树的最小值
                node = node || this.root;
                while (node.left != null) {
                    node = node.left;
                }
                return node.key;
            }
    
            getMax(node) {                //获取二叉树最大值
                node = node || this.root;
                while (node.right != null) {
                    node = node.right;
                }
                return node.key;
            }
    
            find(key) {               // 查找 给定的值
                var node = this.root;
                while ( node != null) {
                    if (key < node.key) {
                        node = node.left;
                    } else if (key > node.key) {
                        node = node.right;
                    } else {
                        return node;
                    }
                }
                return null;
            }
    
            remove(key) {         // 删除给定的值
                this.root = this.removeNode(this.root, key);
            }
    
            removeNode(node, key) {      // 真正删除的函数
                if (node == null) {
                    return  null;
                }
                if (key < node.key) {
                    node.left = this.removeNode(node.left, key);
                    return node;
                } else if (key > node.key) {
                    node.right = this.removeNode(node.right, key);
                    return node;
                } else {
                    if (node.left == null && node.right == null) {
                        node = null;
                        return node;
                    } else if (node.left == null) {
                        return node.right;
                    } else if (node.right == null) {
                        return node.left;
                    } else {
                        var minNode = this.getMin(node.right);
                        node.key = minNode.key;
                        node.count = minNode.count;
                        node.right = this.removeNode(node.right, minNode.key);
                        return node;
                    }
                }
            }
    
        }
  • 相关阅读:
    有关ubuntu11.04不能正常关机或重启的解决方法
    USRP Experiment 3: Using Airprobe Intercepting GSM Traffic
    GSM900 and GSM1800 ARFCN Frequency
    Linux 下Oracle 开机自启动 与 oratab, dbstart 脚本 说明
    Oracle 网络架构(Networking Architecture) 说明
    Oracle Resource Manager 概述
    Oracle AWR 报告中 No data exists for this section of the report 说明
    Oracle Alerts 与 Metrics(警告与度量)说明
    Oracle Listener 设置密码 示例 说明
    Oracle Resource Manager 概述
  • 原文地址:https://www.cnblogs.com/wjyz/p/11068735.html
Copyright © 2011-2022 走看看