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/