zoukankan      html  css  js  c++  java
  • Javascript二叉树算法学习

    <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>BinaryTree</title>
        </head>
        <body>
        
        </body>
        <script type="text/javascript">
            // 构建二叉树
            function BinaryTree () {
                // 定义节点
                var Node = function (key) {
                    this.key=key;
                    this.left=null;//左节点
                    this.right=null;//右节点
                }
                // 根节点
                var root = null;
                var insertNode =function (node,newNode) {
                    if (newNode.key<node.key) {//左边
                        if (node.left===null) { //node没有左孩子
                                node.left=newNode;
                        }else {
                            insertNode(node.left,newNode);
                        }
                    }else { //右边
                        if (node.right===null) {
                            node.right=newNode;  //右孩子
                        }else {
                            insertNode(node.right,newNode);
                        }
                    }
                };
                //插入节点,
                this.insert =function (key) {
                    var newNode = new Node(key);//创建节点对象
                    if (root===null) {
                        root =newNode;  
                    }else {
                        insertNode(root,newNode);
                    }
                };
    
                var inOrderTraverseNode = function (node,callback) {
                    if (node!==null) {
                        inOrderTraverseNode(node.left,callback);
                        callback(node.key);    
                        inOrderTraverseNode(node.right,callback);        
                    }
                };
    
                // 二叉树的遍历算法   
                // 中序遍历 从小到大的排序 如果有左子树,遍历左子树,如果没有,打印当前节点,然后遍历右子树
                this.inOrderTraverse = function (callback) {
                    inOrderTraverseNode(root,callback);
                };
                
                var preOrderTraverseNode = function (node,callback) {
                    if (node!==null) {
                        callback(node.key);
                        preOrderTraverseNode(node.left,callback);
                        preOrderTraverseNode(node.right,callback);
                    }
                };
                //前序遍历   复制二叉树比重现插入。效率高
                //当前结点先输出 然后遍历当前结点的左子树,然后遍历当前节点啊的右子树
                this.preOrderTraverse = function (callback) {
                    preOrderTraverseNode(root,callback);
                };
    
                var postOrderTraverseNode =function (node,callback) {
                    if (node !== null){
                        postOrderTraverseNode(node.left,callback);
                        postOrderTraverseNode(node.right,callback);
                        callback(node.key);
                    }
                };
                //后续遍历 先访问左子树,然后访问右子树,最后访问节点
                // 操作系统的文件系统的遍历
                this.postOrderTraverse = function (callback) {
                    postOrderTraverseNode(root,callback);
                };
    
                var minNode = function (node) {
                    if (node) {
                        while (node && node.left !==null) {
                                node=node.left;
                        }
                        return node.key;
                    }
                    return null;
                };
    
                //二叉树的查找算法 左子树的所有节点小于当前节点,右子树的当前节点大于当前节点
                //min 最小值
                this.min=function () {
                    return minNode(root);
                };
                var maxNode = function (node) {
                    if (node) {
                        while (node && node.right !==null) {
                                node=node.right;
                        }
                        return node.key;
                    }
                    return null;
                };
    
                //max 最大值
                this.max = function () {
                    return maxNode(root);
                };
    
                var searchNode= function (node,key) {
                    if (node ===null) {
                        return false;
                    }    
                    if (key < node.left) { 
                        return searchNode(node.left,key);
                    }else if (key > node.left) {
                        return searchNode(node.right,key);
                    }else {
                        return true;
                    }
    
                };
    
                //search 要查找的数值
                this.search = function (key) {
                    return searchNode(root,key);
                };
                var findMinNode = function(node) {
                    if (node) {
                        while(node && node.left !==null){
                            node = node.left;
                        }
                        return node;
                    }
                    return null;
    
                };
                var removeNode=function(node,key) {
                    if (node === null) {
                        return null;
                    }
                    if (key<node.key) {
                        node.left = removeNode(node.left,key);
                        return node;
                    }else if (key>node.key) {
                        node.right = removeNode(node.right,key);
                        return node;
                    }else {
                        if (node.left ===null && node.right ===null) {
                            node =null;
                            return node;
                        }
                        if (node.left ===null) {
                            node =node.right;
                            return node;
                        }else if (node.right ===null) {
                            node =node.left;
                            return node;
                        }
                        var aux =findMinNode(node.right);
                        node.key = aux.key;
                        node.right =removeNode(node.right,aux.key);
                        return node;
                    }
                };
    
                //删除节点
                this.remove = function(key) {
                    root = removeNode(root,key);
                };
    
            }
    
            var nodes = [8,3,10,1,6,14,4,7,13];
            var binaryTree = new BinaryTree();
            nodes.forEach(function (key) {
                binaryTree.insert(key);
            });
            var callback = function (key){
                console.log(key);
            };
            // binaryTree.inOrderTraverse(callback);
        
            // binaryTree.preOrderTraverse(callback);
    
            // binaryTree.postOrderTraverse(callback);
        
            // console.log(binaryTree.min());
            // console.log(binaryTree.max());
            // console.log(binaryTree.search(7));
            //binaryTree.remove(10);
        </script>
        </html>    
  • 相关阅读:
    Binary Tree Maximum Path Sum
    ZigZag Conversion
    Longest Common Prefix
    Reverse Linked List II
    Populating Next Right Pointers in Each Node
    Populating Next Right Pointers in Each Node II
    Rotate List
    Path Sum II
    [Leetcode]-- Gray Code
    Subsets II
  • 原文地址:https://www.cnblogs.com/niusan/p/7528260.html
Copyright © 2011-2022 走看看