深度优先遍历:从一个节点深入直到尽头再退回前一个节点,继续寻找另一个节点深入遍历。 二叉树的前中后序遍历也可看做深度优先遍历。 前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 广度优先遍历:先遍历中间节点的一层,再逐层往外扩散。 二叉树的层序遍历可以看做广度优先遍历。 层序遍历:从上往下逐层遍历节点
二叉树的前中后序遍历都用到递归,递归的步骤我们可以分为3步来写
- 确定递归函数的参数和返回值
- 确定递归函数的终止条件
- 确定递归函数的实现过程
1.前序遍历:
var preorderTraversal = function(root) {
let res=[];
const dfs=function(root){
//终止条件
if(root===null)return ;
//中:父节点开始
res.push(root.val);
//左:递归左子树
dfs(root.left);
//右:递归右子树
dfs(root.right);
}
dfs(root);
return res;
};
2.中序遍历:
var inorderTraversal = function(root) {
let res=[];
const dfs=function(root){
if(root===null){
return ;
}
dfs(root.left);
res.push(root.val);
dfs(root.right);
}
dfs(root);
return res;
};
3.后序遍历:
var postorderTraversal = function(root) {
let res=[];
const dfs=function(root){
if(root===null){
return ;
}
dfs(root.left);
dfs(root.right);
res.push(root.val);
}
dfs(root);
return res;
};
4.层序遍历:
*/
var levelOrder = function(root) {
let res=[],queue=[];
queue.push(root);
if(root===null){
return res;
}
while(queue.length!==0){
// 记录当前层级节点数
let length=queue.length;
//存放每一层的节点
let curLevel=[];
for(let i=0;i<length;i++){
let node=queue.shift();
curLevel.push(node.val);
// 存放当前层下一层的节点
node.left&&queue.push(node.left);
node.right&&queue.push(node.right);
}
//把每一层的结果放到结果数组
res.push(curLevel);
}
return res;
};