#试题28:对称的二叉树
题目:
请设计一个函数判断一棵二叉树是否 轴对称 。
示例 1:
输入:root = [6,7,7,8,9,9,8]
输出:true
解释:从图中可看出树是轴对称的。
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
解释:从图中可看出最后一层的节点不对称。
思路:
1.中序遍历是左中右,所以初步想法是使用中序遍历把二叉树遍历一遍添加到容器中,这时候要把空着的节点以null的形式添加进容器,针对这种[1,2,2,2,null,2]
树结构,然后把容器分为两段比较他们的值,从而得出是否是对称二叉树
2.书中的想法是使用迭代的思路,将比较左右两个节点,判断他们的情况一共有四种情况,都为空true
,一个为空一个不为空false
,值不一样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 check(TreeNode* root_left,TreeNode* root_right){
if(root_left==nullptr&&root_right==nullptr)
return true;
if(root_left==nullptr || root_right==nullptr)
return false;
if(root_left->val!=root_right->val)
return false;
return check(root_left->left,root_right->right) && check(root_left->right,root_right->left);
}
bool checkSymmetricTree(TreeNode* root) {
return check(root,root);
}
};
leetcode101题
考点:
- 考察对二叉树的理解,实质上是利用树的遍历算法解决问题。
- 考察思维能力,树的对称是一个抽象的概念,需要微秒在短时间内清楚判断对称的步骤并转化为代码