题目
思路
本题需要将二叉树转化为列表,对于二叉树的题目,无非就以下几种解题思路:
-
先序遍历(深度优先搜索)
-
中序遍历(深度优先搜索)(尤其二叉搜索树)
-
后序遍历(深度优先搜索)
-
层序遍历(广度优先搜索)(尤其按照层来解决问题的时候)
-
序列化与反序列化(结构唯一性问题)
根据我们的观察,本题应该是使用深度优先搜索的方式来解决,我们看看是怎样变成一个列表的。如图所示:
其实是分为三步: -
首先将根节点的左子树变成链表
-
其次将根节点的右子树变成链表
-
最后将变成链表的右子树放在变成链表的左子树的最右边
这就是一个递归的过程,递归的一个非常重要的点就是:** 不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出 (非常重要!!不要纠结里面到底是怎样行运作,知道这个的总体使用结果是什么,不要跳进递归,跳进去一定出不来,耶稣来了都没有,最强大脑也撑不住几次压栈和出栈)**。对于函数flatten来说:
函数作用:将一个二叉树,原地将它展开为链表
输入:树的根节点
输出:无
那我们就直接根据三步来写程序就可以了
class Solution {
public void flatten(TreeNode root) {
if(root == null){
return ;
}
//将根节点的左子树变成链表
flatten(root.left);
//将根节点的右子树变成链表
flatten(root.right);
TreeNode temp = root.right;
//把树的右边换成左边的链表
root.right = root.left;
//记得要将左边置空
root.left = null;
//找到树的最右边的节点
while(root.right != null) root = root.right;
//把右边的链表接到刚才树的最右边的节点
root.right = temp;
}
}