淺談js之二叉樹的前,中,后序的遍歷


二叉樹遍歷分為三種:前序、中序、后序,其中序遍歷最為重要。為啥叫這個名字?是根據根節點的順序命名的。

比如上圖正常的一個滿節點,A:根節點、B:左節點、C:右節點,前序順序是ABC(根節點排最先,然后同級先左后右);中序順序是BAC(先左后根最后右);后序順序是BCA(先左后右最后根)。

實現前,中,后序的代碼如下:

<script>
    window.onload = function(){
        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){
                //如果node為null返回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 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);
    }
</script>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM