二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。

比如上图正常的一个满节点,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>
02-14 03:25