Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
1
/
2 5
/
3 4 6
The flattened tree should look like:
1
2
3
4
5
6
思路
从题中我们可以看出在将二叉树转化为单链表之后,链表是有序的,按照二叉树的遍历思路,这个很想前序遍历。但是前序遍历存在一个问题就是对于节点并不好处理,并且单链表都是在节点的右子节点。这样会导致节点指针的指向会出现问题。既然从小到大不行,那就使用从大到小来进行链表的组合。拿例子中的二叉树来举例,先遍历到节点6,然后然后是节点5,在是节点4, 一直到最后的节点1。这个遍历过程很像后序遍历,只不过这里是先遍历二叉树的右节点。继续此方法我们可以写出如下代码。
解决图示
解决代码
1 # Definition for a binary tree node.
2 # class TreeNode(object):
3 # def __init__(self, x):
4 # self.val = x
5 # self.left = None
6 # self.right = None
7
8 class Solution(object):
9 def __init__(self):
10 self.prenode = None # 用来保存上一个节点的位置
11
12 def flatten(self, root):
13 """
14 :type root: TreeNode
15 :rtype: None Do not return anything, modify root in-place instead.
16 """
17 if not root:
18 return
19 self.flatten(root.right) # 先遍历右节点
20 self.flatten(root.left) # 再遍历到做节点
21 root.right = self.prenode # 将当前节点的右节点赋值为上一个节点
22 root.left = None # 左节点设置为空
23 self.prenode = root # 记录下当前节点