114. 二叉树开展为链表
题目起源:力扣(LeetCode)
https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
题目
给定一个二叉树,原地将它开展为一个单链表。
例如,给定二叉树
1 / \ 2 5 / \ \3 4 6
将其开展为:
1 \ 2 \ 3 \ 4 \ 5 \ 6
解题思路
思路: 递归,非递归
递归
咱们先察看例子,能够发现,左子树开展成链表连贯在根节点,而右子树开展链表是紧跟在左子树开展的链表前面。这里应用递归的办法来解决。
应用后序遍历(递归)的具体做法:
- 先找到左子树的最右节点;
- 当找到左子树的最右节点时,令其指向根的右子树;
- 此时,再让根的右子树,指向根节点的左子树;
- 最初,令根节点的左子树为 None,循环直至右子树为空。
具体的代码见【代码实现 # 递归】
非递归
在后面咱们晓得,其实递归的思路,应用了额定的空间。这里,咱们应用非递归的办法来尝试解决。(具体做法同上)
具体的代码见【代码实现 # 非递归】
代码实现
# 递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def flatten(self, root: TreeNode) -> None: """ Do not return anything, modify root in-place instead. """ def unflod(node): if not node: return None unflod(node.left) unflod(node.right) # 后序遍历 if node.left: pre = node.left # 找到左子树的最右子节点,用以连贯根的右子树 while pre.right: pre = pre.right # 当找到左子树的最右子节点,令其指向根的右子树 pre.right = node.right # 而后令根的右子树指向根的左子树,令根的左子树为空 node.right = node.left node.left = None # 循环 node = node.right unflod(root)# 非递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def flatten(self, root: TreeNode) -> None: """ Do not return anything, modify root in-place instead. """ while root: if root.left: pre_node = root.left # 同样先找到左子树的最右节点 while pre_node.right: pre_node = pre_node.right # 最右节点指向根节点的右子树 pre_node.right = root.right # 根的右子树指向根的左子树,同时置空左子树 root.right = root.left root.left = None root = root.right
实现后果
实现后果 | 递归
实现后果 | 非递归
欢送关注
公众号 【书所集录】