二叉树_题目5:101. 对称二叉树

95 阅读2分钟

题目5:101. 对称二叉树

101. 对称二叉树

前序遍历的题目

同类题目

前置知识

题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

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

示例 2:

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

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路分析

对称二叉树: 从根节点把左右子树看作两课单独的树,使用一个递归函数,对左子树leftTree和右子树rightTree 同时进行遍历。满足下面三个条件即可

  • leftTree->left->val == rightTree->right->val
  • leftTree->right->val == rightTree->left->val
  • leftTree->val == rightTree->val

程序代码

 class Solution {
 public:
 ​
     bool travel(TreeNode* leftTree,TreeNode* rightTree)
     {
         // 如果为空,那么两个都为空
         if(leftTree == nullptr || rightTree == nullptr)
         {
             return leftTree == rightTree;
         }
 ​
         // 左右对称,leftTree 的left 对应rightTree 的right
         bool lr = travel(leftTree->left,rightTree->right);
         bool rl = travel(leftTree->right,rightTree->left);
 ​
         return leftTree->val == rightTree->val && lr && rl;
     }
 ​
 ​
     bool isSymmetric(TreeNode* root) {
         // 把整棵树分成左右子树两颗树,进行递归遍历
         return travel(root->left,root->right);
         
     }
 };
 ​

上面的代码还可以优化,使递归提前退出。

 class Solution {
 public:
 ​
     bool travel(TreeNode* leftTree,TreeNode* rightTree)
     {
         // 如果为空,那么两个都为空
         if(leftTree == nullptr || rightTree == nullptr)
         {
             return leftTree == rightTree;
         }
         // 比较两个根节点的值,如果不相等直接退出
         if(leftTree->val != rightTree->val)
         {
             return false;
         }
         // 左右对称,leftTree 的left 对应rightTree 的right
         bool lr = travel(leftTree->left,rightTree->right);
         bool rl = travel(leftTree->right,rightTree->left);
 ​
         return  lr && rl;
     }
 ​
 ​
     bool isSymmetric(TreeNode* root) {
         // 把整棵树分成左右子树两颗树,进行递归遍历
         return travel(root->left,root->right);
         
     }
 };

复杂度分析

时间复杂度O(N) 其中N为二叉树的节点数量, travel() 执行一次可以判断一对节点是否对称,因此

travel()函数最多调用N/2

空间复杂度: O(N) 最差情况下(二叉树退化为链表),使用 O(N/2) 大小的空间,空间复杂度O(N)

更多相关知识:github.com/pingguo1987…