二叉树

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>removeNode</title>
</head>
<body>
<h1>删除值</h1>
<p></p>
<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.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);
//            console.log(root)
        }

        //前序遍历方法
        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;
            }
        }
        //查找最小值
        this.min = function(){
            return minNode(root);
        }

        //查找最大值方法
        var maxNode = function(node){
            if(node){
                while(node && node.right !== null){
                    node = node.right;
                }
                return node.key;
            }
        }
        //查找最大值
        this.max = function(){
            return maxNode(root);
        }

        //查找指定的数值方法
        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.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 binartyTree = new BinaryTree();
    nodes.forEach(function(key){
        binartyTree.insert(key);
    });
    //打印输出相应的值
    var callback = function(key){
        console.log(key);  //打印的值是升序排列
    };
//    binartyTree.inOrderTraverse(callback); //中序遍历
//    binartyTree.preOrderTraverse(callback);  //前序遍历
//    binartyTree.postOrderTraverse(callback);  //后序遍历

    console.log("查找的最小值是:"+ binartyTree.min());
    console.log("查找的最大值是:"+ binartyTree.max());
    console.log(binartyTree.search(9));
    binartyTree.remove(3);
</script>

</body>
</html>

转载于:https://my.oschina.net/u/3706777/blog/1550505

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值