剑指 Offer 28. 对称的二叉树
解题思路:
对称二叉树定义: 对于树中 任意两个对称节点 L 和 R ,一定有:
1.L.val = R.val :即此两对称节点值相等。
2.L.left.val = R.right.val :即 L 的 左子节点 和 R 的 右子节点 对称;
3.L.right.val = R.left.val :即 L 的 右子节点 和 R 的 左子节点 对称。
根据以上规律,考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。
算法流程:
isSymmetric(root) :
特例处理: 若根节点 root 为空,则直接返回 true。
返回值: 即 recur(root.left, root.right) ;
recur(L, R) :
终止条件:
1.当 L 和 R 同时越过叶节点:此树从顶至底的节点都对称,因此 返回 true;
2.当 L 或 R 中只有一个越过叶节点:此树不对称,因此返回 false ;
3.当节点 L 值不等于节点 R 值: 此树不对称,因此返回 false ;
递推工作:
1.判断两节点 L.left 和 R.right是否对称,即 recur(L.left, R.right) ;
2.判断两节点 L.right 和 R.left是否对称,即 recur(L.right, R.left) ;
3.返回值: 两对节点都对称时,才是对称树,因此用与逻辑符 && 连接。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true; //树为空肯定对称
//递归查看左子树和右子树是否对称
return recus(root->left,root->right);
}
public:
bool recus(TreeNode* L,TreeNode* R)
{
if(L == NULL && R == NULL)
return true;
if(L == NULL || R == NULL || L->val != R->val)
return false;
//左的左 == 右的右 && 左的右 == 右的左
return recus(L->left,R->right) && recus(L->right,R->left) ;
}
};