算法刷题记录.leetcode101对称二叉树

87 阅读2分钟

题目描述

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

 

示例 1:

解析

  • 对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树) ,所以在递归遍历的过程中,也是要同时遍历两棵树。

递归三部曲

  1. 确定递归函数的参数和返回值

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。

返回值自然是bool类型。

  1. 确定终止条件

要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。

  1. 确定单层递归的逻辑

此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

  • 比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
  • 比较内测是否对称,传入左节点的右孩子,右节点的左孩子。
  • 如果左右都对称就返回true ,有一侧不对称就返回false 。

代码

/**

* 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 isSymmetric(TreeNode* root) {

bool res = isCompared(root->left,root->right);

return res;

}



bool isCompared(TreeNode* left, TreeNode* right){

if(left == nullptr && right == nullptr) return true;

else if(left != nullptr && right == nullptr) return false;

else if(left == nullptr && right != nullptr) return false;

else if(left->val != right->val) return false;

else{

bool outside = isCompared(left->left,right->right);

bool inside = isCompared(left->right,right->left);

bool child = outside && inside;

return child;

}

}

};