判断二叉树是否对称

133 阅读1分钟

image.png 题目链接:www.nowcoder.com/practice/1b…

题解:需要判断左右子树是否对称,采用递归的方式去写,left和right是对称的。
感觉需要提前想好算法,再去写
方法一:递归(dfs)方式实现

class Solution {
public:
    bool judge(TreeNode* treeLeft,TreeNode* treeRight) {
        if(treeLeft == nullptr && treeRight == nullptr) return true;
        if(treeLeft == nullptr && treeRight != nullptr) return false;
        if(treeLeft != nullptr && treeRight == nullptr) return false;
        if(treeLeft->val != treeRight->val) return false;
        return judge(treeLeft->left, treeRight->right)&&judge(treeLeft->right, treeRight->left);
    }

    bool isSymmetric(TreeNode* root) {
        // write code here
        if(root == nullptr) return true;
        return judge(root->left, root->right);

    }
};

方法二:迭代算法,利用queue实现

class Solution {
public:

    bool isSymmetric(TreeNode* root) {
        // write code here
        if(root == nullptr) return true;

        queue<TreeNode*> leftTree,rightTree;
        leftTree.push(root->left);
        rightTree.push(root->right);
        
        while(!leftTree.empty() && !rightTree.empty()) {
            //把节点取出
            TreeNode *leftTreeNode,*rightTreeNode;
            leftTreeNode = leftTree.front(), leftTree.pop();
            rightTreeNode = rightTree.front(), rightTree.pop();
            //如果都为空,跳过;如果一方为空,一方不为空,返回false,如果值不同,返回false
            if(leftTreeNode == nullptr && rightTreeNode == nullptr) {
                continue;//都为空
            }
            if(leftTreeNode == nullptr && rightTreeNode != nullptr) {
                return false;
            }
            if(leftTreeNode != nullptr && rightTreeNode == nullptr) {
                return false;
            }
            if(leftTreeNode->val != rightTreeNode->val) {
                return false;
            }
            leftTree.push(leftTreeNode->left), leftTree.push(leftTreeNode->right);
            rightTree.push(rightTreeNode->right), rightTree.push(rightTreeNode->left);
        }
        if(!leftTree.empty()||!rightTree.empty()) return false;
        return true;

    }
};