对称二叉树:
如果一个二叉树和其二叉树镜像是一样的,就可以称为是对称二叉树。一棵空树也是对称树。
首先如果一个二叉树是对称的,那么该二叉树的前序遍历结果是回文序列。并且,其镜像二叉树的前序遍历结果
也是回文序列。如果两个序列是一致的,那么该树是对称的。
求解过程:
(1)判断该二叉树与其镜像二叉树是不是空树,如果是则返回true;
(2)判断该二叉树与其镜像二叉树,如果只有一个节点为空,则返回false;
(3)如果二叉树与其镜像二叉树节点都不为空,则比较两棵树对应节点的值是否相同。
代码:
bool isSymmetrical(TreeNode* pRoot)
{
return isSymmetricalCore(pRoot,pRoot);
}
bool isSymmetricalCore(TreeNode* pRoot,TreeNode* pRoot1){
if(!pRoot && !pRoot1 )
return true;
if(!pRoot || !pRoot1)
return false;
if(pRoot->val != pRoot1->val)
return false;
return isSymmetricalCore(pRoot->left,pRoot1->right)
&& isSymmetricalCore(pRoot->right,pRoot1->left);
}
这里的做法是传入的参数是同一棵树(如果是对称的,那么二叉树与其镜像二叉树就是相同的),最后比较的方法是(1)用二叉树的左子树与镜像二叉树的右子树进行比较,(2)二叉树的右子树与镜像二叉树的左子树进行比较,最后取两者的与。先序遍历,先判断根节点的情况,参考上面三条判断规则。然后遍历左子树和遍历右子树。
参考:《剑指offer》、牛客网
ps:只是学习记录过程,如有侵权请指出,定会修正!若有错误,也欢迎指出!