二叉树「遍历」And「分解」

226. 翻转二叉树

114. 二叉树展开为链表

116. 填充每个节点的下一个右侧节点指针

 

二叉树--纲领篇 中,介绍了解决二叉树问题无非就是「遍历」➕「分解」两种方法

对于遇到的题目,我们的思路就是:是否可以通过遍历一遍二叉树得到答案?如果不能的话,是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案? 如果需要设计到子树信息, 建议使用后续遍历

下面本篇文章,将按照这个思路,手把手的带你解决三个实战题目

翻转二叉树

img

对于这个题目的要求就是「翻转整棵树」

首先我们思考一下,是否可以通过遍历一遍二叉树得到答案呢??

那我们现在继续思考是否可以使用分解的思路来解决问题呢??

在使用分解的思路时,我们需要明确「函数返回值」代表的含义,即:给递归函数一个合适的定义,然后用函数的定义来解释你的代码

二叉树展开为链表

img

对于这个题目的要求就是「拉平左子树,接到右子树上」

1

首先我们思考一下,是否可以通过遍历一遍二叉树得到答案呢??

但是注意flatten函数的签名,返回类型为void,也就是说题目希望我们在原地把二叉树拉平成链表

这样一来,没办法通过简单的二叉树遍历来解决这道题了

那我们现在继续思考是否可以使用分解的思路来解决问题呢??

填充每个节点的下一个右侧节点指针

img

对于这个题目的要求就是「node.next = leftNode」

首先我们思考一下,是否可以通过遍历一遍二叉树得到答案呢??

但是如果我们在二叉树的遍历基础上抽象成「三叉树遍历」呢???直接看图!!!

2

OK!直接看代码!!