LeetCode 114 : 二叉树展开为链表
给定一个二叉树,原地将它展开为链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6
思路:非递归先序遍历,遍历过程中维护一个父节点(pre),边遍历边原地修改, 每次连接父节点的右孩子, 将父节点的左孩子 --> None
定义二叉树:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
由列表生成二叉树:
def Create_tree(root,list,i):
if i<len(list):
if not list[i]: return None
else:
root = TreeNode(list[i])
root.left = Create_tree(root.left, list, i*2+1)
root.right = Create_tree(root.right, list, i*2+2)
return root
return root
实现代码:
class Solution:
def flatten(self, root: TreeNode) -> None:
stack = [root]
pre = None
while stack:
node = stack.pop()
if pre:
pre.right = node
pre.left = None
if node:
stack.append(node.right)
stack.append(node.left)
pre = node
return root
测试代码:
if __name__ == "__main__":
s = Solution()
nums = [1,2,5,3,4,None,6]
root = Create_tree(None, nums, 0)
res = pre_order2(root)
print(res)
# r = s.flatten(root)
# # 输出链表
# while r:
# print(r.val)
# r = r.right