Symmetric Tree
2016-06-13 04:48
323 查看
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree
But the following
Note:
Bonus points if you could solve it both recursively and iteratively.
Tags
Tree, DFS, BFS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Recursive Solution
Iterative Solution
Using BFS to check for each level,
if the level of the queue is not multiple of two, return false;
other wise using two pointers to check at each end of the array, if the value is not equal, return false;
*** Pay attention to null left/right node, they also needs to push into the queue.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isSymmetric = function(root) {
if(root === null || (root.left === null && root.right === null)) {
return true;
}
if(root.left === null || root.right === null) {
return false;
}
// Guarantee that root has both left and right
var queue = [];
queue.push(root.left);
queue.push(root.right);
while(queue.length > 0) {
var len = queue.length;
if(len %2 !== 0) {
return false;
}
var start = 0, end = len-1;
while(start < end) {
if(queue[start] === null && queue[end] === null) {
start++;
end--;
} else if(queue[start] === null || queue[end] === null) {
return false;
} else if(queue[start].val !== queue[end].val) {
return false;
} else {
start++;
end--;
}
}
var currentLevel = [];
for(var i in queue) {
if(queue[i] !== null) {
currentLevel.push(queue[i].left);
currentLevel.push(queue[i].right);
}
}
queue = currentLevel;
}
return true;
};
For example, this binary tree
[1,2,2,3,4,4,3]is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following
[1,2,2,null,3,null,3]is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
Tags
Tree, DFS, BFS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Recursive Solution
/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param {TreeNode} root * @return {boolean} */ var isSymmetric = function (root) { if (root === null) { return true; } return symmetric(root.left, root.right); }; function symmetric(left, right) { if (left === null && right === null) { return true; } else if (left === null || right === null) { return false; } else { return (left.val === right.val) && symmetric(left.left, right.right) && symmetric(left.right, right.left); } }
Iterative Solution
Using BFS to check for each level,
if the level of the queue is not multiple of two, return false;
other wise using two pointers to check at each end of the array, if the value is not equal, return false;
*** Pay attention to null left/right node, they also needs to push into the queue.
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {boolean}
*/
var isSymmetric = function(root) {
if(root === null || (root.left === null && root.right === null)) {
return true;
}
if(root.left === null || root.right === null) {
return false;
}
// Guarantee that root has both left and right
var queue = [];
queue.push(root.left);
queue.push(root.right);
while(queue.length > 0) {
var len = queue.length;
if(len %2 !== 0) {
return false;
}
var start = 0, end = len-1;
while(start < end) {
if(queue[start] === null && queue[end] === null) {
start++;
end--;
} else if(queue[start] === null || queue[end] === null) {
return false;
} else if(queue[start].val !== queue[end].val) {
return false;
} else {
start++;
end--;
}
}
var currentLevel = [];
for(var i in queue) {
if(queue[i] !== null) {
currentLevel.push(queue[i].left);
currentLevel.push(queue[i].right);
}
}
queue = currentLevel;
}
return true;
};
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享