版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/82389355
题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
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.如果两个单向链表相交,那这两个链表都一定不存在环