1.二叉树的前序遍历(easy)
前序遍历就是头结点永远第一访问,接着是头结点的左孩子节点,右孩子节点;后序遍历就是左、右、头结点;中序遍历就是左、头结点、右;
所以只要一道题你搞懂了,三道题就是一道题
var preorderTraversal = function(root) {
let res = [];
let helper = function(root){
if(root === null) return;
res.push(root.val);
helper(root.left);
helper(root.right);
}
helper(root);
return res;
};
2.二叉树的中序遍历(easy)
var preorderTraversal = function(root) {
let res = [];
let helper = function(root){
if(root === null) return;
helper(root.left);
res.push(root.val);
helper(root.right);
}
helper(root);
return res;
};
3.二叉树的后序遍历(easy)
var preorderTraversal = function(root) {
let res = [];
let helper = function(root){
if(root === null) return;
helper(root.left);
helper(root.right);
res.push(root.val);
}
helper(root);
return res;
};
4.二叉树的层序遍历(medium)
先给一下力扣官方的题目描述吧 ↓↓↓↓↓
层序遍历就是按照二叉树的结构,先遍历第一层(根节点)再遍历第二层,接着第三层……(还是看图吧,亲自手绘)
以下是我的图解
即结果输出要求,首先是第一层从左到右的节点,接着是第二层,第三层……,那这样改怎么做呢,显然,你用之前的递归是无法完成的,因为你递归是向深处遍历,纵向延伸,无法横向移动!
我们需要借助一个数据结构,队列,队列是先进先出表,你想啊,你每次遍历,先把节点压入队列中,只要队列中有东西,你就先遍历队列里面的,没有了我再接着遍历后面的,把后面一层的压入队列里面去,一直循环到没有节点为之,看代码上的详细注释
1. 层序遍历 I
var levelOrder = function(root) {
let res= [];
let queue = [root];
if(root === null) return res;
while(queue.length > 0){
let node = queue.shift();
res.push(node.val);
if(node.left !== null) queue.push(node.left);
if(node.right !== null) queue.push(node.right);
}
return res;
};
看完注释,如果还是不懂,来看看我的图趴
2. 层序遍历 I I(easy)(搞不懂为什么这个是easy,是因为变式I做出来了吗)
看一下官方题目描述 ↓↓↓↓↓
var levelOrder = function(root) {
let res = [];
let queue = [];
if(root !== null) queue.push(root);
while(queue.length > 0){
let n = queue.length;
let level = [];
for(let i = 0;i < n;i ++){
let node = queue.shift();
level.push(node.val);
if(node.left) queue.push(node.left);
if(node.right) queue.push(node.right);
}
res.push(level);
}
return res;
};
3. 层序遍历 I I I(锯齿形层序遍历)
官方题目描述 ↓↓↓↓↓
其实变式三,就是变式二的一点小改动,每次压入当前层节点的位置不一样而已,奇数从队列的尾插入,偶数从队列头插入,而队列是在头部先进先出(一般),所以,每次出队列的顺序就会按奇偶而不同了
var levelOrder = function(root) {
let count = 0;
let ans = [];
let res = [];
let queue = [root];
if(root === null) return res;
while(queue.length > 0){
count ++;
level = [];
let len = queue.length;
for(let i = 0;i < len;i ++){
let node = queue.shift();
if(count % 2 === 0) level.unshift(node.val);
else level.push(node.val);
if(node.left !== null) queue.push(node.left);
if(node.right !== null) queue.push(node.right);
}
res.push(level);
}
return res;
};
ok,今天就到这里了,感谢浏览,码字不易,不介意的话,给个一键三连再走呗 ヾ(?°?°?)ノ゙
|