您的位置:首页 > Web前端 > JavaScript

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 
[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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息