題目
遞歸
遞歸的思想首先判斷是哪種遍歷方式,這道題應該是前序遍歷,因爲要從根節點開始,那麼依次判斷根的左節點和右節點是否相等。
- 前序遍歷
- 遞歸的結構 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;
}
};