给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
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