101.对称二叉树

news/2024/7/20 21:23:31 标签: 深度优先, 算法, c++

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

例如,二叉树 [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

根左右遍历一次树得到数组,根右左遍历一次得到数组
对比,相等则对称
存在根左右与根右左相等的子树,便使用某个数来标记全部空结点防止出现这种情况

/**
 * Definition for a binary tree node.
 * 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:
    void leorder(TreeNode*root,vector <int>&arrleft)
    {
        if(!root){arrleft.push_back(-1);return;}
        arrleft.push_back(root->val);
        leorder(root->left,arrleft);
        leorder(root->right,arrleft);

    }
    void riorder(TreeNode*root,vector <int>&arrright)
    {
        if(!root){arrright.push_back(-1);return;}
        arrright.push_back(root->val);
        riorder(root->right,arrright);
        riorder(root->left,arrright);

    }
    bool isSymmetric(TreeNode* root) {
        vector<int>arrleft;
        vector<int>arrright;
        leorder(root,arrleft);
        riorder(root,arrright);
        if(arrleft==arrright)return 1;
        else return 0;


    }
};

当然,这个方法不够聪明


方法二:

使用两个指针分部从左边右边遍历即可,使用原理为递归

/**
 * Definition for a binary tree node.
 * 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 check(TreeNode*p,TreeNode* q)
    {
        if(!q&&!p)return true;
        if(!p||!q)return false;
        return (p->val==q->val)
        &&check(p->left,q->right)
        &&check(p->right,q->left);
    }

    bool isSymmetric(TreeNode* root) {
        return check(root,root);
    }
};

方法三:

利用队列,类似于层序遍历来迭代它,也可以说是广度搜索(或许

/**
 * Definition for a binary tree node.
 * 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 check(TreeNode* u,TreeNode* v)
    {
        queue<TreeNode*>que;
        que.push(u);que.push(v);
        while(!que.empty())
        {  u=que.front();que.pop();
           v=que.front();que.pop();
        if(!u&&!v)continue;
        if((!u||!v)||u->val!=v->val)return false;
        que.push(u->left);
        que.push(v->right);

        que.push(u->right);
        que.push(v->left);

        }
        return true;
    }
    bool isSymmetric(TreeNode* root) {
        return check(root,root);

    }
};

http://www.niftyadmin.cn/n/1185827.html

相关文章

typedef struct

用途一&#xff1a; 定义一种类型的别名&#xff0c;而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如&#xff1a; char* pa, pb; // 这多数不符合我们的意图&#xff0c;它只声明了一个指向字符变量的指针&#xff0c; 和一个字符变量&#xff1b; 以下则可…

平衡二叉树(AVL)的构造,插入与删除代码(利用递归)

创建AVL树并判断是否为完全二叉树 题目描述 在AVL树中&#xff0c;任何节点的两个子树的高度最多相差1&#xff1b;如果它们高度相差不止1&#xff0c;则需要重新平衡以恢复这种属性。 现在给定一个插入序列&#xff0c; 一个一个地将键值插入初始为空的AVL树中&#xff0c; …

第一次实践一个多文件的代码

收获 1.#ifndef防止头文件重复包含 为了避免同一个头文件被包含&#xff08;include&#xff09;多次&#xff0c;C/C中有两种宏实现方式&#xff1a;一种是#ifndef方式&#xff1b;另一种是#pragma once方式。 #ifndef 标识符A //每一个头文件都要有自己独特的标识 //(有一定…

数据结构全集

判断栈混洗 题目描述 判断一个输入序列是否为某一个序列的栈混洗。设输入序列为1-N的数字。 输入&#xff1a; n&#xff0c;随后输入一个包含n个数字序列。范围从1到n的不同数字 输出&#xff1a; 如果是合法的栈混洗输出ture,否则输出false; 要求O(N)时间复杂度 样例…

排序算法新版(懒得继续

排序算法 文章目录排序算法比较类算法插入排序1. 直接插入排序2. 折半插入排序3. 希尔排序交换排序4. 冒泡排序5. 快速排序选择排序6. 简单选择排序7. 1堆排序&#xff08;最大堆&#xff09;7. 2 堆排序&#xff08;最小堆&#xff09;归并排序8. 二路归并排序9. 多路归并排序…

java oj

java ab Problem 题目描述对于给定的两个整数a和b&#xff0c;求它们的和。输入描述&#xff1a;a b输出描述&#xff1a;a&#xff0c;b之和Sampleinput:555 445output:1000import java.util.Scanner;public class Main {public static void main(String[] arg) {Scanner scn…

已经安装了,但是老是报错:zsh: command not found: brew

已经安装了&#xff0c;但是老是报错&#xff1a;zsh: command not found: brewecho $PATH 查看环境变量 使用zsh作为终端的 cd &#xff5e; vim .zprofile&#xff0c;并在文件中加入如下代码 export PATH/usr/local/bin:$PATH保存关闭后 source ~/.zprofile即可。

Algorithm oj 全集(已过oj)

Algorithm oj 分治策略_作业1 找出数组中第 k 小的数 总提交数: 616次 通过数: 188次 通过率: 30.52% 内存限制: 104857600(BYTE) 时间限制: 10000(MS) 输入限制: 1000(行) 输出限制: 1000(行) 题目描述 给定整型数组 S 和整数 k&#xff0c;S的长度为n&#xff0c;…