题目
递归
递归的思想首先判断是哪种遍历方式,这道题应该是前序遍历,因为要从根节点开始,那么依次判断根的左节点和右节点是否相等。
- 前序遍历
- 递归的结构 dfs(root1->left,root2->right), dfs(root1->right,root2->left)
- 递归结束的条件
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
bool res = func(root,root);
return res;
}
bool func(TreeNode* root1,TreeNode* root2)
{
if(root1 == NULL && root2 == NULL)
return true;
if(root1==NULL || root2==NULL)
return false;
if(root1->val != root2->val)
return false;
bool left = func(root1->left,root2->right);
bool right = func(root1->right,root2->left);
return left&&right;
}
};
迭代
迭代我们可以使用bfs的方式,层序遍历对于每一层我们调用判断回文的函数。从而可以实现迭代的方法。
另一种迭代方式我们可以两两入队,出队保证比较的元素刚好是对称位置上的,如下代码所示:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL) {
return true;
}
queue<TreeNode*> queue;
queue.push(root->left);
queue.push(root->right);
while (!queue.empty()) {
TreeNode* node1 = queue.front();
queue.pop();
TreeNode* node2 = queue.front();
queue.pop();
if (node1 == NULL && node2 == NULL) {
continue;
}
if (node1 == NULL || node2 == NULL || node1->val != node2->val) {
return false;
}
queue.push(node1->left);
queue.push(node2->right);
queue.push(node1->right);
queue.push(node2->left);
}
return true;
}
};