对称二叉树
二叉树由于其本身具有递归特性,所以绝大部分二叉树的算法题用递归的方法都很好解。如果不用递归方法,也可以使用堆栈以及队列来对二叉树进行迭代,其实算法思想都是一样的。
这道题有两个解题思路:
第一个思路是层序遍历,因为对称二叉树每一层的遍历结果都是回文串。这样的方法虽然比较直观,但是实现起来不如下面的简单。
第二个思路是,在对称二叉树中,我们把整棵树分为左部分和右部分(根节点的左右子树),其中左部分和右部分是镜像对称的,所以有这样的结论:左子树的左子树和右子树的右子树的节点值是相等的(这里指的是左子树的左子树的根节点,而不是整颗子树),且左子树的右子树和右子树的左子树也有这样的结论。
下面是分别用递归和迭代的方法来解题,算法思路是一样的:
1.递归
class Solution {
public:
bool compareTree(TreeNode* left, TreeNode* right) {
if (left == NULL && right == NULL) return true;
else if (left == NULL && right != NULL || left != NULL && right == NULL) return false;
if (left->val == right->val) {
return compareTree(left->left, right->right) && compareTree(left->right, right->left);
} else {
return false;
}
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
return compareTree(root->left, root->right);
}
};
2.迭代
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
stack<TreeNode*> s;
if(root->left and root->right){
s.push(root->left);
s.push(root->right);
} else if(!root->left and !root->right) {
return true;
} else {
return false;
}
while(!s.empty()){
TreeNode* p = s.top();
s.pop();
TreeNode* q = s.top();
s.pop();
if(p->val != q->val) return false;
if(p->left and q->right){
s.push(p->left);
s.push(q->right);
} else if((p->left and !q->right) or (!p->left and q->right)) {
return false;
}
if(p->right and q->left){
s.push(p->right);
s.push(q->left);
} else if((p->right and !q->left) or (!p->right and q->left)) {
return false;
}
}
return true;
}
};
网友评论