题目描述
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1 | 1 |
将其展开为:
1 | 1 |
题解
解法一
这道题可以看作是, 从根节点开始遍历, 将左子树挂在右子树的位置, 然后将右子树挂在原左子树的最右节点的右子树位置.
1 |
|
根据这样的思路, 编写代码:
1 | public void flatten(TreeNode root) { |
后序遍历+递归
一开始我是想用先序遍历做的, 因为展开后的顺序就是先序遍历的结果. 每遍历到一个节点就让上一个节点的右指针指向当前节点. 做法是创建一个全局变量pre
它表示的是上一个节点. 遍历到一个节点, 就让它称为pre
的右儿子, 但是有个问题就是, 当把节点2放在pre
的右边后, 节点5就要消失了, 再也找不回来. 退栈时右边本来应该是节点5, 但是不存在了.
所以只能用后序遍历的方法, 从底向上地连接链表. 连接顺序改变一下即可, 遍历到当前节点时, 令其右指针指向上一个节点. 遍历的顺序改为先遍历右子树
1 | class Solution { |