重学数据结构之二叉树的基础遍历方法

95 阅读1分钟

1.前序遍历

跟节点-左子树-右子树

1)。递归方法

function preOrder(root){
    if(root === null){
        return;
    }
    console.log(root.val);
    preOrder(root.left);
    preOrder(root.right);
}

2) 非递归方法

function preOrder(root){
    if(root === null){
        return null;
    }
    var queue = [];
    queue.push(root);
    while(queue.length !== 0){
        var temp = queue.pop();//出栈
        console.log(temp.val);//第一步先拿到的是根节点
        if(temp.right!== null){
            queue.push(temp.right)
        }
        if(temp.left !== null){
            queue.push(temp.left);
        }

    }
}
//因为我们这里使用的是数组的pop方法将后加入的元素先pop出来,所以我们先将右节点入栈,
//再将左节点入栈,以保证拿出来的时候先拿的是左节点。

2. 中序遍历:左子树-- 跟节点-- 右子树

1)递归:

function inOrder(root){
    if(root === null){
        return;
    }
    inOrder(root.left);
    console.log(root.val);
    inOrder(root.right);
}

2)非递归

function inOrder(root){
    var stack = [];
    while(root !== null || stack.length !== 0){
        //一直一直的去遍历左子树,如果左节点不为空则全部压入栈中。
        while(root !== null){
            stack.push(root);
            root = root.left;//先判断左节点是否为空,不为空将她们全部入栈
        }
        //当跳出这个while循环的时候,左节点全部压入栈中    
        if(stack.length!== 0){//开始把左节点出栈
            root = stack.pop();//把最左边上的左节点出栈并打印
            console.log(root.val);
            root = root.right;//看看出栈的节点是否有右子节点
        }//如果有的话,再次进入while(root !== null)这个循环里面,将这个节点的右子节点压入栈中依次循环
    }
}

3.后序遍历

左子树--右子树--根

1).递归

function postOrder(root){
     if(root === null){
        return;
    }
    postOrder(root.left);
    postOrder(root.right);
    console.log(root.val)
}

2)非递归。

function postOrder(root){
    if(root === null){
        return;
    }
    var stack1 = [];
    var stack2 = [];
    stack1.push(tree);
    while(stack1.length !== 0){
        root = stack1.pop();
        stack2.push(root);
        if(root.left !== null){
            stack1.push(root.left);
        }
        if(root.right !== null){
            stack1.push(root.right)
        }
    }
    while(stack2.length !== 0){
        console.log(stack2.pop().val)
    }
}

利用两个栈,先把节点按照层序遍历的顺序压入stack1中,再pop出一个节点,将此节点压入stack2中

4.层序遍历

function levelOrder(root){
    if(root === null){
        return;
    }
    var queue = [];
    queue.push(root);
    while(queue.length !== 0){
        var temp = queue.pop();
        console.log(temp.val);
        if(temp.left !== null){
            queue.push(temp.left);
        }
        if(temp.right !== null){
            queue.push(temp.right);
        }
    }
}