算法练习----二叉树

164 阅读1分钟

中序遍历是一种以上行顺序访问二叉树所有节点的遍历方式,也就是从小到大的顺序。inOrderTraverse方法接收一个回调函数作为参数,用递归的方式遍历。

先序遍历-------首先检查以参数形式传入的节点是否为null(--这是停止递归继续执行的判断条件--),然后,递归调用相同的函数来访问左侧子节点。接着对这个节点进行一些操作(callback方法),然后在访问右侧子节点。

中序遍历-------与先序遍历不同的是,执行顺序是先访问节点本身,然后访问它的左侧子节点,最后是右侧子节点。


function BinarySearchTree() {
    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)
    }

    //先序遍历
    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 tree = new BinarySearchTree()
tree.insert(11);
tree.insert(7);
tree.insert(15);
tree.insert(5);
tree.insert(3);
tree.insert(9);
tree.insert(8);
tree.insert(10);
tree.insert(13);
tree.insert(12);
tree.insert(14);
tree.insert(20);
tree.insert(18);
tree.insert(25);
tree.insert(6);

function printNode(val) {
    console.log(val);
}
tree.inOrderTraverse(printNode)