zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

对称的二叉树


题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

解题思路

判断是否是对称二叉树,即需遍历二叉树输出的序列与二叉树的镜像输出序列进行对比,若相同即为对称二叉树。

问题就是怎样得到二叉树的镜像?

无论是前序遍历、中序遍历、后序遍历,它们的特点是先遍历左树再遍历右树。因此为了获得二叉树的镜像,则只需在遍历的时候先遍历右树再遍历左树即可。

img

图一:前序遍历的输出序列是:8657765;镜像遍历:8657765;两个输出序列相同则认定为对称二叉树。

图二:前序遍历的输出序列是:8657795;镜像遍历:8957765;两个输出序列不同,则不是对称二叉树。

图三:前序遍历的输出序列是:77777;镜像遍历:777777;单从输出序列上看,判断是对称二叉树,但是从给的树的形状上看明显不是对称二叉树。

通过观察发现,在前序遍历的过程中习惯把NULL省略。为了确保对于所有结点都相等的二叉树有效,所以在遍历的过程中需要将NULL也要输出。

图三:前序遍历的输出:777777NULL; 镜像遍历:77NULL7777.两个输出序列不同,则不是对称二叉树。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct TreeNode
{
int val;
struct TreeNode* left;
struct TreeNode* right;
TreeNode (int x): val(x), left(NULL), right(NULL) {}
};
class Solution
{
public:
bool isSymmetrical (TreeNode* pRoot)
{
if (pRoot == NULL)
return true;
return isSymmetricalCore(pRoot, pRoot);
}
private:
bool isSymmetricalCore (TreeNode* pRoot1, TreeNode* pRoot2)
{
if (pRoot1 == NULL && pRoot2 == NULL)
return true;
if (pRoot1 == NULL || pRoot2 == NULL)
return false;
if (pRoot1->val != pRoot2->val)
return false;
return isSymmetricalCore(pRoot1->left, pRoot2->right) && isSymmetricalCore(pRoot1->right, pRoot2->left);
}
};

参考链接:https://cuijiahua.com/blog/2018/01/basis_58.html

文章作者:zerofly

发布时间:2020年06月06日 - 21:06

原始链接:http://zeroflycui.github.io/150c34dd.html

许可协议: 转载请保留原文链接及作者。