二叉树展开为链表

思路:

根据二叉树的前序遍历,先得到二叉数的前序遍历列表,再转为单链表。转为单链表的时候,左节点为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 = right
class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        #前序遍历
        # 先弄成数组,再弄成单链表
        # root.left=None root.right=root.val
        preorderlist=list()
        def preorder(root):
            if not root:
                return 
            preorderlist.append(root)
            preorder(root.left)
            preorder(root.right)

        preorder(root)
        n=len(preorderlist)
        for i in range(1,n):
            prev,cur=preorderlist[i-1],preorderlist[i]
            prev.left=None
            prev.right=cur
        

思路2:

迭代法:一边遍历,一边构建单链表,

运用栈,每次从栈内弹出一个节点作为当前访问的节点,获得该节点的子节点,如果子节点不为空,则依次将右子节点和左子节点压入栈内(注意入栈顺序先右后左)。

展开为单链表的做法是,维护上一个访问的节点 prev,每次访问一个节点时,令当前访问的节点为 curr,将 prev 的左子节点设为 null 以及将 prev 的右子节点设为 curr,然后将 curr 赋值给 prev,进入下一个节点的访问,直到遍历结束。需要注意的是,初始时 prev 为 null,只有在 prev 不为 null 时才能对 prev 的左右子节点进行更新。

# 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 = right
class Solution:
    def flatten(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        #前序遍历
        # 先弄成数组,再弄成单链表
        # root.left=None root.right=root.val
        # preorderlist=list()
        # def preorder(root):
        #     if not root:
        #         return 
        #     preorderlist.append(root)
        #     preorder(root.left)
        #     preorder(root.right)

        # preorder(root)
        # n=len(preorderlist)
        # for i in range(1,n):
        #     prev,cur=preorderlist[i-1],preorderlist[i]
        #     prev.left=None
        #     prev.right=cur
        if not root:
            return 
        stack=[root]
        prev=None
        while stack:
            cur=stack.pop()
            left,right=cur.left,cur.right
            if right:
                stack.append(right)
            if  left:
                stack.append(left)
            if prev:
                prev.left=None
                prev.right=cur
            prev=cur

        
            

            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值