数据结构之二叉树基础oj练习

1.单值二叉树

力扣https://leetcode-cn.com/problems/univalued-binary-tree/

以上是递归图解思路:这样的思路非常不好想到。

也就是利用了我们的分治思想和逆向思维。

首先说说这里的分治思想

分治也就是要一层一层地分治下去判断。

第一个if语句在这里起到了非常关键的作用,为什么这样说呢?

这个if函数我们设计者的本意可能是防止root为空时,那么也属于单值二叉树,但是听过我们画了递归图后发现,这个if函数竟然在后面强大地起到了判断真假的效果

看着这个图进行思考,当我们最后一个节点的左右子树同时都为空时,很显然这就可以看作一个独立的节点,那么我们就返回true,并且在return里面是一个并的关系,那么必须两个都为true时,往上返回才会返回true。

逆向思维:

可能很多数人在这里想的是去判断根的值和左右子树的值相等,这样的作法会使得程序非常地繁琐,我们可以采用逆向思维,加入一旦出现了左右子树与根有不相同的情况,那么我们直接返回false就可,并且这里就一个值得注意的地方:在判断值时首先要判断这不是一个空指针才行!

这题的思维非常跳跃且需要非常清晰的逻辑条理

 2.二叉树的前序遍历

力扣https://leetcode-cn.com/problems/binary-tree-preorder-traversal/

此题有几个需要非常注意的点:

第一首先我们需要自己malloc一个数组出来,然而这个数组的大小我们并不知道,所以我们首先需要写一个函数来递归算出传进来的数组实际大小是多少,并且在最后的时候将这个数组的大小赋值给returnSize一下,如果这里最后不将size赋值程序也会跑不了。

第二在这个题目所给的接口函数中,我们不方便进行前序遍历,很难递归,因为如果在这个函数里面去完成递归,意味着我们每次都要malloc一下,所以我们应当自己设计一个函数去完成递归。

第三,在设计函数递归的时候,数组的起始地址i=0这一步应当放在外部赋值,并且需要非常小心这里的i需要传地址过去,如果不传地址会造成函数栈帧销毁过后i并为受到++操作的影响,最后结果会是随机值。

力扣https://leetcode-cn.com/problems/binary-tree-inorder-traversal/

力扣https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

力扣https://leetcode-cn.com/problems/same-tree/

101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/symmetric-tree/

此题的对此思想跟上一题非常类似,先判断根节点是否为空,判断完成过后。我们新建立一个函数,函数需要传root的左右两个子树。让这左右两个子树去进行比较,这一步就跟上面题目的代码非像了,唯独不一样的是,这一题是拿左子树的left和右子树的right不断递归比较这个对称结构,不过思路都是一模一样的。

另一棵树的子树 - 提交记录 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/submissions/detail/285277393/

二叉树遍历_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力icon-default.png?t=M276https://www.nowcoder.com/practice/4b91205483694f449f94c179883c1fef?tpId=60&&tqId=29483&rp=1&ru=/activity/oj&qru=/ta/tsing-kaoyan/question-ranking先大致将这个树描绘一下:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~|Bernard|

你的鼓励是我写下去最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值