题目大意

把一棵二叉树变为链表(扁平化),也就是一棵所有节点要么没有子节点,要么只有右节点的二叉树。

解题思路

参考答案

思路:递归实现,暂存右结点,将左结点接在根结点右边,然后把暂存的右结点接在后面

可以看出来变化后每个节点其实都是指向了在先序遍历中的后一个节点。所以就通过栈的方式来先序遍历原树,如果一个节点有左节点,那么把它的右节点压栈(如果有的话),右指针指向原来的左节点;如果一个节点没有子节点,应该把它的右指针指向栈顶的节点。

代码

class Solution(object):

    def flatten(self, root):
        """ :type root: TreeNode :rtype: void Do not return anything, modify root in-place instead. """
        pointer = dummy = TreeNode(None)
        stack = [root]
        while stack:
            top = stack.pop()
            if not top: continue
            stack.append(top.right)
            stack.append(top.left)
            pointer.right = top
            pointer.left = None
            pointer = top

总结