对称二叉树-C++

对称的二叉树

http://www.nowcoder.com/questionTerminal/ff05d44dfdb04e1d83bdbdab320efbcb

本题思路较为简单:主要比较左子树和右子树是否对称,即比较左子树的右子树是否与右子树的左子树相同,且左子树的左子树与右子树的右子树相同。(有点绕/笑哭,其实开始我向想叉了,以为题目是要比较左子树和右子树是否完全相同了)。
主要思路:

  1. 判断输入的节点是否为空或为叶子节点,如果是的话直接返回true;
  2. 递归比较当前节点的左子树和右子树是否对称:
    (1)如果左树和右树都到达叶子节点,若值相等则返回true,不相等返回false;
    (2)如果左树的左子树与右树的右子树均为空,则返回true;
    如果左树的左子树为空且右树的右子树不为空,则返回false;
    如果左树的左子树不为空且右树的右子树不为空,则返回false;
    如果左树的左子树不为空且右树的右子树不为空的情况下,递归进行下一步的比较;
    (3)只有当左树的左子树与右树的右子树相同的情况下,进一步按上述方法比较左树的右子树与右树的左子树,直到均相同返回true,否则返回false。

代码实现如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    bool isSymmetrical(TreeNode* pRoot)
    {
        if(pRoot==NULL || (pRoot->left==NULL && pRoot->right==NULL)){
            return true;
        }
        return judgeSolve(pRoot->left,pRoot->right);//判断左右子树是否相等
    }
private:
    bool judgeSolve(TreeNode* leftRoot,TreeNode* rightRoot){
        //到达叶子节点
        if((leftRoot->left==NULL&&leftRoot->right==NULL) && 
           (rightRoot->left==NULL&&rightRoot->right==NULL)){
            if(leftRoot->val == rightRoot->val){
                return true;
            }
            else{
                return false;
            }
        }
        if(leftRoot->val != rightRoot->val){
            return false;
        }
        else{
            //继续比较两棵树的左右子树是否相等
            bool leftFlag=false;
            bool rightFlag=false;
            if(leftRoot->left==NULL && rightRoot->right==NULL){
                leftFlag=true;
            }
            else if((leftRoot->left==NULL&&rightRoot->right!=NULL) || 
                    (leftRoot->left!=NULL&&rightRoot->right==NULL)){
                leftFlag=false;
                return false;
            }
            else{
                leftFlag=judgeSolve(leftRoot->left,rightRoot->right);
            }
            //左子树相同再比较右子树
            if(leftFlag==true){
                if(leftRoot->right==NULL && rightRoot->left==NULL){
                    rightFlag=true;
                }
                else if((leftRoot->right==NULL&&rightRoot->left!=NULL) || 
                        (leftRoot->right!=NULL&&rightRoot->left==NULL)){
                    return false;
                }
                else{
                    rightFlag=judgeSolve(leftRoot->right,rightRoot->left);
                }
                if(rightFlag==true){
                    return true;
                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
    }
};
全部评论

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
11-15 19:28
已编辑
蚌埠坦克学院 硬件开发
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务