javascript二叉树基本功能实现

javascript二叉树基本功能实现

都是常用的功能。

删除是最复杂的。。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <script src="js/lib/angular.min.js"></script>
    <script >
        function BinarySearchTree(){
            var Node = function(key){
                this.key = key;
                this.left = null;
                this.right = null;
            };
            var root = null;
            
            this.insert = function(key){
                var newNode = new Node(key);
                
                if (root === null) {
                    root = newNode;
                } else {
                    insertNode(root, newNode);
                }
            };
            
            var insertNode = function(node, newNode) {
                if (newNode.key < node.key) {
                    if (node.left === null) {
                        node.left = newNode;
                    } else {
                        insertNode(node.left, newNode);
                    }
                }else{
                    if (node.right == null) {
                        node.right = newNode;
                    } else {
                        insertNode(node.right, newNode);
                    }
                }
            };
            
            this.inOrderTraverse = function(callback) {
                inOrderTraverseNode(root, callback);
            };
            
            var inOrderTraverseNode = function(node, callback) {
                if (node !== null) {
                    inOrderTraverseNode(node.left, callback);
                    callback(node.key);
                    inOrderTraverseNode(node.right, callback);
                }
            };
            
            this.preOrderTraverse = function(callback){
                        preOrderTraverseNode(root, callback);
                    };
                    
                    var preOrderTraverseNode = function (node, callback) {
                        if (node !== null) {
                            callback(node.key); //{1}
                            preOrderTraverseNode(node.left, callback); //{2}
                            preOrderTraverseNode(node.right, callback); //{3}
                        }
                    };
                    
                    this.postOrderTraverse = function(callback){
                        postOrderTraverseNode(root, callback);
                    };
            
            var postOrderTraverseNode = function (node, callback) {
                        if (node !== null) {
                            postOrderTraverseNode(node.left, callback); //{1}
                            postOrderTraverseNode(node.right, callback); //{2}
                            callback(node.key); //{3}
                        }
                    };
                    
                    this.min = function() {
                        return minNode(root);
                    };
                    
                    var minNode = function(node) {
                        if (node) {
                            while (node && node.left !== null) {
                                node = node.left;
                            }
                            return node.key;
                        }
                        return null;
                    };
                    
                    this.max = function() {
                        return maxNode(root);
                    };
                    
                    var maxNode = function (node) {
                        if (node){
                            while (node && node.right !== null) { //{5}
                                node = node.right;
                            }
                            return node.key;
                        }
                        return null;
                    };
                    
                    this.search = function(key) {
                        return searchNode(root, key);
                    };
                    
                    var searchNode = function(node, key) {
                        if (node === null) {
                            return false;
                        }
                        if (key < node.key) {
                            return searchNode(node.left, key);
                        } else if (key > node.key) {
                            return searchNode(node.right, key);
                        }else{
                            return true;
                        }
                    };
                    
                    this.remove = function(key) {
                        root = removeNode(root, key);
                    };
                    
                    var removeNode = function(node, key){
                        if (node === null){ //{2}
                            return null;
                        }
                        if (key < node.key){ //{3}
                            node.left = removeNode(node.left, key); //{4}
                            return node; //{5}
                        } else if (key > node.key){ //{6}
                            node.right = removeNode(node.right, key); //{7}
                            return node; //{8}
                        } else { //键等于node.key
                            //第一种情况——一个叶节点
                            if (node.left === null && node.right === null){ //{9}
                            node = null; //{10}
                            return node; //{11}
                            }
                            //第二种情况——一个只有一个子节点的节点
                            if (node.left === null){ //{12}
                            node = node.right; //{13}
                            return node; //{14}
                            } else if (node.right === null){ //{15}
                            node = node.left; //{16}
                            return node; //{17}
                            }
                            //第三种情况——一个有两个子节点的节点
                            var aux = findMinNode(node.right); //{18}
                            node.key = aux.key; //{19}
                            node.right = removeNode(node.right, aux.key); //{20}
                            return node; //{21}
                        }
                    };
                    
        }
        
        function printNode(value) {
                console.log(value);
        }
            
          var tree = new BinarySearchTree();
          tree.insert(11);
          tree.insert(7);
                tree.insert(15);
                tree.insert(5);
                tree.insert(3);
                tree.insert(9);
                tree.insert(8);
                tree.insert(10);
                tree.insert(13);
                tree.insert(12);
                tree.insert(14);
                tree.insert(20);
                tree.insert(18);
                tree.insert(25);
                tree.insert(6);
                
                tree.inOrderTraverse(printNode);
                tree.preOrderTraverse(printNode);
                tree.postOrderTraverse(printNode);
                console.log(tree.min());
                console.log(tree.max());
                console.log(tree.search(1) ? 'Key 1 found.' : 'Key 1 not found.');
                console.log(tree.search(8) ? 'Key 8 found.' : 'Key 8 not found.');
                    
        
    </script>

</head>
<body>

</body>
</html>

javascript二叉树基本功能实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108897.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit

    2021年12月25日
    46
  • Iterator 和 Iterable 差别和联系「建议收藏」

    Iterator 和 Iterable 差别和联系

    2022年1月21日
    36
  • 线程间通信的几种方法_c语言线程函数

    线程间通信的几种方法_c语言线程函数线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法。线程间通信及同步方法介绍:一、线程间的通信方式1、使用全局变量主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。2、使用消息实现通信在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息…

    2022年10月6日
    0
  • Java中compareTo()方法比较字符串详解

    Java中compareTo()方法比较字符串详解中心:String是字符串,它的比较用compareTo方法,它从第一位开始比较,如果遇到不同的字符,则马上返回这两个字符的ascii值差值.返回值是int类型1.当两个比较的字符串是英文且长度不等时,1)长度短的与长度长的字符一样,则返回的结果是两个长度相减的值a=”hello”;b=”hell”;num=1;或者a=”h”;b=”hello”;num=4;2)…

    2022年7月13日
    15
  • web安全详解(渗透测试基础)[通俗易懂]

    web安全详解(渗透测试基础)[通俗易懂]文章目录一、Web基础知识1.http协议2.网络三种架构及特点3.Web应用的特点4.URL组成6.Http协议的性质7.请求响应报文的格式8.请求方法9.http缓存10.缓存新鲜度如何判断11.Http重定向原理以及状态码12.HTTPS协议数字证书13.HTTPS协议与HTTP协议的区别?14.Web客户端的作用15.Web服务端作用16.集群环境的作用17.什么是Cookie,Cookie的作用。18.Cookie的类型19.session的作用和原理Session的原理Session的两

    2022年6月19日
    31
  • springboot的启动流程及原理_精馏的原理及流程

    springboot的启动流程及原理_精馏的原理及流程1.springboot的启动类入口@SpringBootApplication@ComponentScan(basePackages={“cn”})publicclassSpringBootDemo{publicstaticvoidmain(String[]args){SpringApplication.run(SpringBootDemo.class);}}可以看出,Annotation定义(@SpringBootApplicati

    2022年8月21日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号