二叉树展开为链表
LeetCode 114
本题还有其他两种解法 @windliang,我使用先序遍历,用栈存储右孩子节点的方法避免,右指针丢失。
解法1
变体的先序遍历,这题如果用正常的先序遍历的话,会丢失右孩子,为了更好的控制算法,用先序遍历的迭代形式,正常的先序遍历代码如下:
1 | public static void preOrderStack(TreeNode root) { |
还有一种特殊的先序遍历,提前将右孩子保存到栈中,我们利用这种遍历方式就可以防止右孩子的丢失了。由于栈是先进后出,所以我们先将右节点入栈。
1 | public void preorder(TreeNode root) { |
之前我们的思路如下:
题目其实就是将二叉树通过右指针,组成一个链表。
1 -> 2 -> 3 -> 4 -> 5 -> 6
我们知道题目给定的遍历顺序其实就是先序遍历的顺序,所以我们可以利用先序遍历的代码,每遍历一个节点,就将上一个节点的右指针更新为当前节点。
先序遍历的顺序是 1 2 3 4 5 6。
遍历到 2,把 1 的右指针指向 2。1 -> 2 3 4 5 6。
遍历到 3,把 2 的右指针指向 3。1 -> 2 -> 3 4 5 6。
因为我们用栈保存了右孩子,所以不需要担心右孩子丢失了。用一个 pre 变量保存上次遍历的节点。修改的代码如下:
Java代码
1 | /** |
题目
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6