题目5: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->valleftTree->right->val == rightTree->left->valleftTree->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…