剑指 Offer 28. 对称的二叉树

剑指 Offer 28. 对称的二叉树 - 力扣(LeetCode) (leetcode-cn.com)

目录

递归

运行结果

代码

非递归中序

运行结果

代码

非递归先序

 运行结果

代码

非递归后序

运行结果

代码


递归

运行结果

代码

class Solution {
    typedef TreeNode* tree;
public:
    bool isSymmetric(TreeNode* root) {
        if(!root) return true;
        return is_symmetric(root->left, root->right);
    }

    bool is_symmetric(tree Ltree, tree Rtree) {
        if (!Ltree && !Rtree) return true;
        if ((!Ltree && Rtree) || (Ltree && !Rtree)) return false;
        if (Ltree->val != Rtree->val) return false;
        return is_symmetric(Ltree->left, Rtree->right) && is_symmetric(Ltree->right, Rtree->left);
    }
};

非递归中序

运行结果

代码

class Solution {
#define scale 0x1000
    typedef TreeNode* tree;
public:
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;

        tree stk[scale];    int sp = 0;
        tree Ltree = root->left, Rtree = root->right;
        while (Ltree || Rtree || sp) {
            while (Ltree && Rtree) {
                stk[sp++] = Ltree;  stk[sp++] = Rtree;
                Ltree = Ltree->left;    Rtree = Rtree->right;
            }
            if (Ltree || Rtree) return false;
            if (sp) {
                Rtree = stk[--sp];  Ltree = stk[--sp];
                if (Ltree->val != Rtree->val) return false;
                Ltree = Ltree->right;   Rtree = Rtree->left;
            }
        }
        return true;
    }
};

非递归先序

 运行结果

代码

class Solution {
#define scale 0x22
    typedef TreeNode* tree;
public:
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;

        tree stk[scale];    int sp = 0;
        tree Ltree = root->left, Rtree = root->right;
        while (Ltree || Rtree || sp) {
            while (Ltree && Rtree) {
                if (Ltree->val != Rtree->val) return false;
                stk[sp++] = Ltree;  stk[sp++] = Rtree;
                Ltree = Ltree->left;    Rtree = Rtree->right;
            }
            if (Ltree || Rtree) return false;
            if (sp) {
                Rtree = stk[--sp];  Ltree = stk[--sp];
                Ltree = Ltree->right;   Rtree = Rtree->left;
            }
        }
        return true;
    }
};

非递归后序

运行结果

代码

class Solution {
#define scale 0x2A
    typedef TreeNode* tree;
public:
    bool isSymmetric(TreeNode* root) {
        if (!root) return true;

        tree Ltree = root->left, Rtree = root->right;
        tree stk[scale];    int sp = 0;
        bool otherside_unprocessed[scale];  int buoy = 0;
        while (Ltree || Rtree || sp) {
            while (Ltree && Rtree) {
                stk[sp] = Ltree;  stk[sp + 1] = Rtree;  sp += 2;
                otherside_unprocessed[buoy++] = 1;
                Ltree = Ltree->left;    Rtree = Rtree->right;
            }

            if (Ltree || Rtree) return false;

            while (sp) {
                Rtree = stk[sp - 1];    Ltree = stk[sp - 2];
                if (otherside_unprocessed[buoy - 1]) {
                    otherside_unprocessed[buoy - 1] = 0;
                    Ltree = Ltree->right;   Rtree = Rtree->left;
                    break;
                }
                if (Ltree->val != Rtree->val) return false;
                Ltree = Rtree = NULL;
                sp -= 2;    --buoy;
            }
        }
        return true;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值