层序遍历
题目链接:层序遍历
解题思路: 顾名思意,一层一层地遍历这棵树,由这一点我们可以想到,要保留这一层的遍历值,又要给下一层的遍历开放入口,且要定好遍历的终止条件。受卡尔的启发,我选择使用队列这个数据结构来存放所遍历的值,然后根据层来加入result结果集。这里需要指定一个size变量,来记录每一层元素的数量。
解题代码:
var levelOrder = function(root) {
let queue = [];
let result = [];
let size = 0;
if(root)queue.push(root);
while(queue.length){
size = queue.length;
let vec = [];
while(size--){
let cur = queue[0];
queue.shift();
vec.push(cur.val);
if(cur.left){
queue.push(cur.left);
}
if(cur.right){
queue.push(cur.right);
}
}
result.push(vec);
}
return result;
};
翻转二叉树
题目链接: 翻转二叉树
解题思路: 题目很简单,就是翻转左右子树
首先应该弄清楚的是使用哪种遍历,使用前序和后序遍历是最直接的,这里不推荐使用中序遍历,在思路上有点麻烦,在代码上也有点麻烦。可以这么想吧,翻转的时候我们可以从上层的左右节点开始翻转,也可以从下边的左右节点开始翻转,但是先翻转左子树的,然后再翻转上层的左右子树的就会造成一些混乱,左子树翻转好后回到上一层翻转,再转到右子树,可刚刚处理的就是这棵树,可以画图试一试。
解题代码:
var swap = function(leftNode,rightNode,root){
root.left = rightNode;
root.right = leftNode;
}
// 前序遍历
var invertTree = function(root){
// 终止条件
if(!root)return null;
swap(root.left,root.right,root);
invertTree(root.left);
invertTree(root.right);
return root;
}
对称二叉树
题目链接: 对称二叉树
解题思路: 由题意,本质上就是看根节点的左子树和右子树是否能翻转,注意,这道题我们只能使用后序遍历,为什么?因为只有后序遍历我们才能把是否相等的信息返回给上一层,如果是使用前序,后边的还没处理呢,怎么知道结果呢,如果是中序,就很乱了,其实说到这,也不是说使用前序或是中序不行,就是用这俩个写代码的话有点多,要处理很多逻辑。
解题代码:
var isSymmetric = function (root) {
let left = root.left;
let right = root.right;
let compare = function(left,right){
if(!left && right)return false;
else if(left && !right)return false;
else if(!left&&!right)return true;
else if(left.val !== right.val)return false;
let outside = compare(left.left,right.right);
let inside = compare(left.right,right.left);
let result = outside && inside;
return result;
}
return compare(left,right);
};