剑指offer第二版(Python3)--面试题36:二叉搜索树与双向链表

第2章 面试需要的基础知识

第3章 高质量的代码

第4章 解决面试题的思路

  面试题27:二叉树的镜像
  面试题29:顺时针打印矩阵
  面试题30 :包含min函数的栈
  面试题31:栈的压入、弹出序列
  面试题32:上往下打印二叉树
  面试题33: 二叉搜索树的后序遍历序列
  面试题34: 二叉树中和为某一值的路径
  面试题35:复杂链表的复制
  面试题36:二叉搜索树与双向链表

第5章 优化时间和空间效率

第6章 面试中的各项能力

第7章 两个面试案例


题目描述

  输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解题思路
  最好的方法是O(1)空间复杂度,那些中序遍历二叉树的然后使用列表存储节点的方法就不介绍了。
在这里插入图片描述
  根据二叉搜索树的特点:左结点的值<根结点的值<右结点的值,我们不难发现,使用二叉树的中序遍历出来的数据的数序,就是排序的顺序。因此,首先,确定了二叉搜索树的遍历方法。
  接下来,我们看下图,我们可以把树分成三个部分:值为10的结点、根结点为6的左子树、根结点为14的右子树。根据排序双向链表的定义,值为10的结点将和它的左子树的最大一个结点链接起来,同时它还将和右子树最小的结点链接起来。
在这里插入图片描述
  按照中序遍历的顺序,当我们遍历到根结点时,它的左子树已经转换成一个排序的好的双向链表了,并且处在链表中最后一个的结点是当前值最大的结点。我们把值为8的结点和根结点链接起来,10就成了最后一个结点,接着我们就去遍历右子树,并把根结点和右子树中最小的结点链接起来。

实战

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        if not pRootOfTree:
            return None

        def convertCore(root, last):
            if not root:
                return last
            # 一直遍历到最左节点
            last = convertCore(root.left, last)
            # 将已排序链表最大值节点链接到当前节点的左指针
            root.left = last
            # 将已排序链表最大值节点的右指针指向当前节点
            if last:
                last.right = root
            # 当前节点加入链表中,且是最大值节点
            last = root
            
            last = convertCore(root.right, last)
            
            return last
        
        p = convertCore(pRootOfTree, None)
        while p.left:
            p = p.left
        return p
        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值