101. 对称二叉树,c++迭代递归解法
101. 对称二叉树,c++迭代递归解法
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
这道题可以用迭代和递归两种方法求解
迭代法代码如下,主要思想是,将树的左右分支放入两个队列中。因为题目是判断两个数是否对称,所以在将节点a
的孩子放左队列时,先放a
的右子结点,再放a
的左子结点;在将节点b
的孩子放入右队列时,先放b
的左子节点,再放b
的右子节点。如果该数对称,则按照该放法,左右队列是相等。若左右队列不相等,则该二叉树不对称。
class Solution {
public:
bool isSymmetric(TreeNode* ro) {
if(root==NULL)
return true;
queue<TreeNode*> left;
left.push(root->left);
queue<TreeNode*> right;
right.push(root->right);
while (!right.empty()&&!left.empty())
{
TreeNode* cur_left = left.front();
TreeNode* cur_right=right.front();
left.pop();
right.pop();
if(cur_left==NULL||cur_right==NULL){
if(cur_left==NULL&&cur_right==NULL)
continue;
return false;
}
if(cur_right->val!=cur_left->val)
return false;
left.push(cur_left->right);
left.push(cur_left->right);
right.push(cur_right->left);
right.push(cur_right->right);
}
return true;
}
};
递归法:
这种方法是看了解答以后写出来的,代码简洁很多,但思想和迭代法一样,判断left的左子节点和right的右子节点是否相同,left的右子节点和right的左子节点是否相同。
public:
bool isSymmetric(TreeNode* ro) {
return isMirror(root,root);
}
bool isMirror(TreeNode* left,TreeNode *right){
if(left==NULL&&right==NULL) return true;
if(left==NULL||right==NULL) return false;
return (left->val==right->val)&&
isMirror(left->right,right->left)&&
isMirror(left->left,right->right);
}
};