JavaScript实现二叉搜索树

JavaScript实现二叉搜索树

前序、中序、后序遍历均为左节点在右节点之前

区别:

        前序遍历根节点在前,顺序是  根->左->右

        中序遍历根节点在中,顺序是  左->根->右

        后序遍历根节点在后,顺序是  左->右->根

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
    </body>
    <script>
        class Node{
            constructor(val){
                this.val = val;
                this.left = null;
                this.right = null;
            }
        }
        
        class BinarySearchTree{
            constructor(){
                this.root = null;
            }
            
            insert(val){
                if(this.root == null){
                    this.root = new Node(val);
                }else{
                    this.insertNode(this.root,val);
                }
            }
            
            insertNode(node,val){
                if(node.val > val){
                    if(node.left == null){
                        node.left = new Node(val);
                    }else{
                        this.insertNode(node.left,val);
                    }
                }else{
                    if(node.right == null){
                        node.right = new Node(val);
                    }else{
                        this.insertNode(node.right,val);
                    }
                }
            }
                        
            // 先序遍历
            preOrderTraverse(){
                this.preOrderTraverseNode(this.root);
            }
            
            preOrderTraverseNode(node){
                console.log(node.val);
                if(node.left) this.inOrderTraverseNode(node.left);
                if(node.right) this.inOrderTraverseNode(node.right);
            }
            
            // 中序遍历
            inOrderTraverse(){
                this.inOrderTraverseNode(this.root);
            }
            
            inOrderTraverseNode(node){
                if(node.left) this.preOrderTraverseNode(node.left);
                console.log(node.val);
                if(node.right) this.preOrderTraverseNode(node.right);
            }
            
            // 后序遍历
            postOrderTraverse(){
                this.postOrderTraverseNode(this.root);
            }
            
            postOrderTraverseNode(node){
                if(node.left) this.postOrderTraverseNode(node.left);
                if(node.right) this.postOrderTraverseNode(node.right);
                console.log(node.val);
            }
            
            // 层序遍历
            levelOrder(root) {
                if(root == null) return [];
            
                let result = [];
                let nodeArr = [];
            
                nodeArr.push(root);
            
                while(nodeArr.length){
                    let size = nodeArr.length;
                    let arr = [];
                    for(let i = 0; i < size; i++){
                        let node = nodeArr.shift();
                        arr.push(node.val);
                        if(node.left != null) nodeArr.push(node.left);
                        if(node.right != null) nodeArr.push(node.right);
                    }
                    result.push(arr);
                }
                return result;
            }
        }
        
        let bTree = new BinarySearchTree();
        
        bTree.insert(11);
        bTree.insert(7);
        bTree.insert(15);
        bTree.insert(5);
        bTree.insert(9);
        bTree.insert(13);
        bTree.insert(20);
        
        console.log("pre")
        bTree.preOrderTraverse();
        console.log("in");
        bTree.inOrderTraverse();
        console.log("post");
        bTree.postOrderTraverse();
        console.log("level");
        let arr = bTree.levelOrder(bTree.root);
        console.log(arr);
    </script>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值