AcWing 49.二叉搜索树与双向链表(Python版)

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。

  • 要求不能创建任何新的结点,只能调整树中结点指针的指向。

注意:

需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
在这里插入图片描述

思路

对于一棵二叉搜索树,其中序遍历结果为升序的有序结果,以例中的二叉搜索树为例,其中序遍历结果为[4,6,8,10,12,14,16]。
由于题中要求不能创建新的结点,且只能调整树中结点指针的指向,故可以将树的节点按照中序遍历的顺序记录在列表中,再遍历该列表,将当前节点的右指针指向下一个节点,下一个节点的左指针指向当前节点,最后返回节点列表的首元素即可。

代码实现

class Solution(object):
    def convert(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if root is None:
            return root
        res = []
        def inorder(root):		# 中序遍历
            if not root:
                return
            inorder(root.left)
            res.append(root)	# 按照中序遍历顺序记录对应节点
            inorder(root.right)
        inorder(root)
        for i, node in enumerate(res[:-1]):
            node.right = res[i+1]	# 当前节点的右指针指向下一个节点
            res[i+1].left = node	# 下一个节点的左指针指向当前节点
        return res[0]	# 返回双向链表首节点
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值