Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
中序遍历树,看是否为回文串。注意,如评论所说,该方法存在错误。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
private:
vector<int> vals;
void traverse(TreeNode *root) {
if (root == NULL) {
return;
}
traverse(root->left);
vals.push_back(root->val);
traverse(root->right);
}
public:
bool isSymmetric(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (root == NULL) {
return true;
}
vals.clear();
traverse(root);
for (int i = 0; i < vals.size() / 2; i++) {
if (vals[i] != vals[vals.size() - i - 1]) {
return false;
}
}
return true;
}
};
产生错误的原因:回文串丢失了层次,位置信息。
我采用了一种笨方法解决了这个问题,那便是逐层检查逐层扩展,检查每一层的节点是否互相对称。
import java.util.ArrayList;
import java.util.List;
public class Solution {
class ExtTreeNode {
TreeNode node;
long pos;
ExtTreeNode(TreeNode node, long pos) {
this.node = node;
this.pos = pos;
}
}
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
List<ExtTreeNode> lNodes, rNodes, lTempNodes, rTempNodes;
lNodes = new ArrayList<ExtTreeNode>();
rNodes = new ArrayList<ExtTreeNode>();
if (root.left != null) {
lNodes.add(new ExtTreeNode(root.left, 1));
}
if (root.right != null) {
rNodes.add(new ExtTreeNode(root.right, 2));
}
int count = 2;
while (lNodes.size() > 0) {
if (rNodes.size() == 0 || rNodes.size() != lNodes.size()) {
return false;
}
lTempNodes = new ArrayList<ExtTreeNode>();
rTempNodes = new ArrayList<ExtTreeNode>();
for (int i = 0; i < lNodes.size(); i++) {
ExtTreeNode lNode = lNodes.get(i);
ExtTreeNode rNode = rNodes.get(i);
if (lNode.pos + rNode.pos != count + 1 || lNode.node.val != rNode.node.val) {
return false;
}
if (lNode.node.left != null) {
lTempNodes.add(new ExtTreeNode(lNode.node.left, lNode.pos * 2 - 1));
}
if (lNode.node.right != null) {
lTempNodes.add(new ExtTreeNode(lNode.node.right, lNode.pos * 2));
}
if (rNode.node.right != null) {
rTempNodes.add(new ExtTreeNode(rNode.node.right, rNode.pos * 2));
}
if (rNode.node.left != null) {
rTempNodes.add(new ExtTreeNode(rNode.node.left, rNode.pos * 2 - 1));
}
}
lNodes = lTempNodes;
rNodes = rTempNodes;
count *= 2;
}
return rNodes.size() == 0;
}
}
在LeetCode的讨论中存在更简洁的方法。