LeetCode Day16:对称二叉树

发布于 2022-09-05  1043 次阅读


题号:101
难度:Easy
链接:https://leetcode.cn/problems/symmetric-tree/

思路

跟Day14的相同的二叉树思路相似,也是利用栈逐个对比节点,栈空则返回true。只不过此次要用到两个栈。

代码

#include <stack>
using std::stack;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if((root->left==nullptr&&root->right==nullptr)||root==nullptr) return true;
        if((root->left==nullptr&&root->right!=nullptr)||(root->left!=nullptr&&root->right==nullptr)) return false;
        stack<TreeNode*> s,t;
        s.push(root->left);t.push(root->right);
        while(!s.empty()||!t.empty()){
            if((s.empty()&&!t.empty())||(!s.empty()&&t.empty())) return false;
            TreeNode* p=s.top(),*q=t.top();
            s.pop();t.pop();
            if(p->val!=q->val) return false;
            if((p->right==nullptr&&q->left!=nullptr)||(p->right!=nullptr&&q->left==nullptr)) return false;
            else if(p->right!=nullptr&&q->left!=nullptr){
                s.push(p->right);
                t.push(q->left);
            }
            if((p->left==nullptr&&q->right!=nullptr)||(p->left!=nullptr&&q->right==nullptr)) return false;
            else if(p->left!=nullptr&&q->right!=nullptr){
                s.push(p->left);
                t.push(q->right);
            }
        }
        return true;
    }
};

提交结果

代码是长了点,但运行表现还不错,只是空间占用高一些。