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);
}
}
}