算法题31:对称的二叉树
思路1:递归
分别按照根左右和根右左的顺序遍历二叉树,每个结点处均比较一次是否对称。
思路2:层序遍历
将原来的二叉树分为左右两个子树,分别借助一个队列来保存结点,包括NULL,比较对称的时候分三种情况:
1、两边都是NULL,弹出继续比较下一个结点;
2、只有一边为NULL或者两边结点值不等,不对称;
3、两边对称,将下一层结点加入队列,注意,左子树按从左到右加入队列,右子树按从右到左加入队列。
代码
bool isSymmetrical(TreeNode* pRoot) {
//分别从左右开始层次遍历,对比节点值是否相同
if(!pRoot) return true;
queue<TreeNode*> ql; //分别保存左右子树结点
queue<TreeNode*> qr;
ql.push(pRoot->left);
qr.push(pRoot->right);
while(!ql.empty() || !qr.empty()){
TreeNode *nl = ql.front();
TreeNode *nr = qr.front();
ql.pop();
qr.pop();
// cout<<nl->val<<" "<<nr->val<<endl;
if(!nl && !nr){
//1、结点均不存在
continue;
}
if(!nl || !nr || nl->val != nr->val){
//2、两边不对称
return false;
}
else{
// 3、结点存在并相等,弹出队首结点,加入下一层结点
ql.push(nl->left);
ql.push(nl->right);
qr.push(nr->right);
qr.push(nr->left);
}
}
return true;
}