力扣101题(对称二叉树、递归、迭代法)

101.给定一个二叉树,检查它是否是镜像对称的。

  1. 本来还想着这个题要用什么遍历去遍历二叉树,但是想来想去觉得都不合适。看了题解才恍然大悟,只需要将二叉树分为内侧和外侧,递归地比较内侧和外侧的节点相不相同就可以了。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

//用于比较二叉树的内侧和外侧是否对称
bool compare(struct TreeNode* left, struct TreeNode* right) {
    if (left == NULL && right == NULL)
        return true;
    else if (left != NULL && right == NULL)
        return false;
    else if (left == NULL && right != NULL)
        return false;
    else if (left->val != right->val)
        return false;
    bool inside = compare(left->right, right->left);
    bool outside = compare(left->left, right->right);
    return inside && outside;
}


bool isSymmetric(struct TreeNode* root){
    if (!root)
        return true;
    return compare(root->left, root->right);
}
  1. 另一种解法是迭代法,也就是非递归法,利用队列每次比较外侧两个节点或内侧两个节点是否相同,如果相同的话再入队它们的孩子节点,入队顺序要满足两个同时是外侧结点或两个同时是内侧结点。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */




bool isSymmetric(struct TreeNode* root){
    if (!root)
        return true;
    struct TreeNode* queue[2000];
    int front = 0, rear = 0;
    queue[rear] = root->left;
    queue[++rear] = root->right;
    while (front <= rear) {
        struct TreeNode* left = queue[front++];
        struct TreeNode* right = queue[front++];
        if (left == NULL && right == NULL)
            continue;
        if (left == NULL || right == NULL || left->val != right->val)
            return false;
        queue[++rear] = left->left;
        queue[++rear] = right->right;
        queue[++rear] = left->right;
        queue[++rear] = right->left;
    }
    return true;
}

这里的队列其实只是充当了一个容器而已,把队列改成栈一样可行。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */




bool isSymmetric(struct TreeNode* root){
    if (!root)
        return true;
    struct TreeNode* stack[2000];
    int top = -1;
    stack[++top] = root->right;
    stack[++top] = root->left;
    while (top != -1 ) {
        struct TreeNode* left = stack[top--];
        struct TreeNode* right = stack[top--];
        if (left == NULL && right == NULL)
            continue;
        if (left == NULL || right == NULL || left->val != right->val)
            return false;
        stack[++top] = right->right;
        stack[++top] = left->left;
        stack[++top] = right->left;
        stack[++top] = left->right;
    }
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值