解题思路:
\qquad
解这道题的关键在于,如何理解轴对称的二叉树。
\qquad
左子树和右子树之间是轴对称的,这两部分可以通过左右翻转相互转化。对于两个轴对称的节点:
\qquad
L_node->left = R_node->right
,L_node->right = R_node->left
递归:
\qquad
使用两个指针,同时遍历左右子树,并比较左右节点的值,在寻找下一个节点时,进行翻转即可。
bool isSymmetric(TreeNode* root) {
return treeComp(root->left, root->right);
}
bool treeComp(TreeNode* tree1, TreeNode* tree2)
{
if(!tree1 && !tree2) return true;
if(!tree1 || !tree2) return false;
if(tree1->val != tree2->val) return false;
bool treel = treeComp(tree1->left, tree2->right);
bool treer = treeComp(tree1->right, tree2->left);
return treel && treer;
迭代:
\qquad
迭代可以使用BFS,同时存两个子树的节点,并将其相邻排列,比较队列中相邻两个节点是否值相同。
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
TreeNode* lnode = nullptr;
TreeNode* rnode = nullptr;
while(!q.empty())
{
lnode = q.front();
q.pop();
rnode = q.front();
q.pop();
if(!lnode && !rnode) continue;
else if(lnode && rnode && (lnode->val == rnode->val))
{
q.push(lnode->left);
q.push(rnode->right);
q.push(lnode->right);
q.push(rnode->left);
}
else return false;
}
return true;
}