leetcode_114_二叉树展开为链表

二叉树展开为链表

描述

中等

给定一个二叉树,原地将它展开为链表。

例如,给定二叉树

    1
   / \
  2   5
 / \   \
3   4   6

将其展开为:

1
 \
  2
   \
    3
     \
      4
       \
        5
         \
          6

解题

展开的结果类似于将二叉树进行先序遍历然后按顺序挂在right指针上

如果是每遍历一个值就把他挂在右边,容易丢弃原来的右子树

所以设置一个栈,用来保存各子树

# 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.
        """
        if not root:
            return
        
        stack = [root]
        pre = None

        while stack:
            temp = stack.pop()
            if pre:
                pre.right = temp
                pre.left = None
            # 右子树先进后出,出栈先遍历左子树
            if temp.right:
                stack.append(temp.right)
            if temp.left:
                stack.append(temp.left)
                
            pre = temp

按照遍历的顺序一个个重排链表

# 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.
        """
        cur = root
        while cur:
            # 若左子树为空,则不需要重排,直接考虑右子树节点
            if not cur.left:
                cur = cur.right
            else:
                # 找到左子树最右边的节点p
                p = cur.left
                while p.right:
                    p = p.right
                # 将当前节点的右子树接到其左子树最右边节点的右孩子位置
                p.right = cur.right
                # 将其左子树接到右子树上
                cur.right = cur.left
                # 设置当前左子树为None
                cur.left = None
                # 下一个节点
                cur = cur.right
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值