• 面试题28:对称的二叉树(C++)


    题目地址:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/

    题目描述

    请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。

    例如,二叉树 [1,2,2,3,4,4,3] 是对称的。

        1
       /
      2   2
     / /
    3  4 4  3
    但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:

        1
       /
      2   2
         
       3    3

    题目示例

    示例 1:

    输入:root = [1,2,2,3,4,4,3]
    输出:true
    示例 2:

    输入:root = [1,2,2,null,3,null,3]
    输出:false

    解题思路

    DFS

    (1)递归:利用递归的方法判断左右子树的值是否相同,具体分为左子树和右子树是否均为空,左子树和右子树是否完整,以及左子树和右子树的值是否相等几种情况,当左右子树相等时,比较左子树的左节点和右子树的右节点,以及左子树的右节点和右子树的左节点。

    (2)非递归-栈:利用双指针p和q分别遍历左子树和右子树,其中指针p一直往左遍历,遍历左子树顺序为根节点->左节点->右节点,指针q一直往右,遍历右子树顺序为根节点->右节点->左节点

    BFS

    队列:利用队列进行迭代,因为二叉树为镜像,所以其中队列中连续的两个节点应该是相等的,要实现这一功能,需要我们装入队列元素时,先装入左子树的左节点,然后装入右子树的右节点,以及左子树的右节点和右子树的左节点,最后进行判断,当两个节点均为空时,此时说明满足镜像条件,则继续循环寻找镜像节点,否则当其中的一个节点为空时,返回false,说明此时不能构成镜像。

    程序源码

    递归

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isSymmetric(TreeNode* root) {
            if(root == nullptr) return true; //判空
            return isMirror(root->left, root->right);
        }
        bool isMirror(TreeNode* left, TreeNode* right)
        {
            if(left == nullptr && right == nullptr) return true; //左右子树均为空,返回true
            if(left == nullptr || right == nullptr) return false; //左右子树中有一个是空,则返回false
            if(left->val != right->val) return false; //左右子树值不相等,返回false
            return isMirror(left->left, right->right) && isMirror(left->right, right->left); //左右子树相等时,比较左子树的左节点和右子树的右节点,以及左子树的右节点和右子树的左节点
        }
    };

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isSymmetric(TreeNode* root) {
            if(root == nullptr) return true;
            stack<TreeNode*> s1, s2;
            TreeNode* p = root;
            TreeNode* q = root;
            while (p != nullptr || !s1.empty()) {
                while (p != nullptr) {
                    if (q == nullptr || p->val != q->val) return false; //左右子树其一为空或者两个指针当前节点值不相等
                    s1.push(p);
                    s2.push(q);
                    p = p->left; 
                    q = q->right; 
                }
                if (q != nullptr) return false;  //p为空,q不为空,即左右子树其一为空
                p = s1.top(); 
                s1.pop();
                q = s2.top(); 
                s2.pop();
                p = p->right;
                q = q->left;
            }
           return true; 
        }
    };

    队列

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        bool isSymmetric(TreeNode* root) {
            if(root == nullptr) return true;
            queue<TreeNode*> que;
            que.push(root->left);
            que.push(root->right);
            while(!que.empty())
            {
                TreeNode* p = que.front();
                que.pop();
                TreeNode* q = que.front();
                que.pop();
                if(p == nullptr && q == nullptr) continue;    
                if(p == nullptr || q == nullptr) return false;
                if(p->val != q->val) return false;
                que.push(p->left);
                que.push(q->right);
                que.push(p->right);
                que.push(q->left);
            }
            return true;
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    AOS编排语言系列教程(五):创建安全组SecurityGroup
    AOS编排语言系列教程(四):创建弹性云服务器ECS
    GO语言实现 自动登陆华为云并获取cookies 详解(兼介绍SSO单点登陆)
    人脸匹配搜索指北
    人脸识别使用base64的方式添加人脸
    AOS编排语言系列教程(三):创建子网Subnet
    AOS编排语言系列教程(二):初识AOS编排语言,创建你的第一个AOS模板
    华为云社区·CSDN【寻找黑马程序员】有奖征文活动,邀你挥洒才情
    AOS编排语言系列教程(一):开启AOS之旅,解锁各种自动化姿势
    00063_String类
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12657538.html
Copyright © 2020-2023  润新知