题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
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 Symmetrical(pRoot,pRoot);
}
bool Symmetrical(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 (Symmetrical(pRoot1->left, pRoot2->right) && Symmetrical(pRoot1->right, pRoot2->left));
}
};
这道题也是通过很久的修改才通过的,首先就是你需要第二个函数,是因为你本身的函数只有一个参数,既然是比较是不是对称,那两个参数比较起来可能更加方便一些,如果是只有一个原函数的话可能就复杂一些。
还有就是第二个函数对比的时候你要比的是return (Symmetrical(pRoot1->left, pRoot2->right) && Symmetrical(pRoot1->right, pRoot2->left));第一次我比较的时候也是比较的根1的左和根2的左去比,如果想不明白的话可以去想一下折叠。这个程序也并不难,思路相同之后代码还是比较简单的。
今天继续给大家分享选择题
以下关于单向链表说法正确的是
A.如果两个单向链表相交,那他们的尾结点一定相同
B.快慢指针是判断一个单向链表有没有环的一种方法
C.有环的单向链表跟无环的单向链表不可能相交
D.如果两个单向链表相交,那这两个链表都一定不存在环
最开始做题的时候没有发现这道题是一个多选题,不过当时认为这个题很简单也没必要拿出来说一下,但是看了答案之后发现还是有一些自己没有想到的地方。看到A的时候感觉没什么错误,但是不敢选,看到B的时候感觉这句话实在是没有什么错误,就直接选了B,然后就没有往下看。
答案是:ABC
这里我们每个选项介绍一下
![](https://i-blog.csdnimg.cn/blog_migrate/5cb2282c3c4d35e965571322b6b8fff5.png)
A这里要明抓住题目的重点,虽然感觉A是正确的但是没有找到重点,当时没有太去考虑next指针情况,这里主要是只有一个next指针,所以一旦相交,相交结点的next都是一样的,所以不会出现不同的情况。
B自然就不用说了快慢指针就是用来判断我们链表是不是有环的,剑指offer里边就有一道题目让我们来判断是不是带环以及环的入口点,我之前也有很详细的介绍过方法
C的意思我认为就是说,当前我遍历了一下这两个链表发现,其中一个是带环的一个是不带环的,所以这两个是不可能相交的
![](https://i-blog.csdnimg.cn/blog_migrate/eda758d083364cac4b81a27a26fc10ba.png)
说来说去还是和A比较类似,D自然就不用说了C图中左边的就是推翻D的情况。
不知道这个题还有没有升级版,不是单链表了双链表什么的,不过明白原理之后仔细想想是可以举一反三。