剑指offer--对称的二叉树

题目描述

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

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

这里我们每个选项介绍一下

A这里要明抓住题目的重点,虽然感觉A是正确的但是没有找到重点,当时没有太去考虑next指针情况,这里主要是只有一个next指针,所以一旦相交,相交结点的next都是一样的,所以不会出现不同的情况。

B自然就不用说了快慢指针就是用来判断我们链表是不是有环的,剑指offer里边就有一道题目让我们来判断是不是带环以及环的入口点,我之前也有很详细的介绍过方法

https://blog.csdn.net/Hanani_Jia/article/details/79815538 不知道的可以去我上次的博客看一下。

C的意思我认为就是说,当前我遍历了一下这两个链表发现,其中一个是带环的一个是不带环的,所以这两个是不可能相交的

说来说去还是和A比较类似,D自然就不用说了C图中左边的就是推翻D的情况。

  不知道这个题还有没有升级版,不是单链表了双链表什么的,不过明白原理之后仔细想想是可以举一反三。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值