《剑指offer》- [第4章:解决面试题的思路 - 4.3:举例让抽象问题具体化] -题27:二叉搜索树转换成双向链表

1、问题描述

输入一棵二叉搜索树,将该二叉树转换成一个排序的双向链表。要求不能创建新的节点,只能调整树中节点指针的指向。例如,输入下面的一棵二叉树,则输出转换之后的排序双向链表。
在这里插入图片描述

2、解题思路

  • 边界条件:二叉搜索树的头节点为空;
  • 思路1:把树中每一个节点的左指针作为双向链表中该节点的前向指针,右指针作为双向链表中该节点的后向指针。由于要求转换后的双向链表是排好序的,所以可以中序遍历树中的每一个节点。当遍历到根节点时,可以把树看成三部分:值为10的根节点,根节点值为6的左子树和根节点值为14的右子树,在转换时,根节点将和左子树的最大一个节点(节点8)连接起来,同时它还将和右子树的最小节点(节点12)连接起来。
  • 按照中序遍历的顺序,当我们转换到根节点时,其左子树已经转换成了一个排序的双向链表。并且处于链表的最后一个节点是左子树中值最大的节点。我们把链表的最后一个节点和根节点连接起来,此时,链表中的最后一个节点是根节点。接着我们去遍历转换右子树,然后把右子树中的最小节点和根节点连接起来。
    在这里插入图片描述

3、代码实现

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # write code here
        pLastNodeInList = None
        pLastNodeInList = self.ConvertNode(pRootOfTree, pLastNodeInList)

        pHeadOfList = pLastNodeInList
        while pHeadOfList != None and pHeadOfList.left != None:
            pHeadOfList = pHeadOfList.left

        return pHeadOfList



    def ConvertNode(self,pRoot, pLastNodeInList):
        if pRoot == None:
            return

        pCurrent = pRoot
        if pCurrent.left != None:
            pLastNodeInList = self.ConvertNode(pCurrent.left, pLastNodeInList)

        pCurrent.left = pLastNodeInList
        if pLastNodeInList != None:
            pLastNodeInList.right = pCurrent

        pLastNodeInList = pCurrent

        if pCurrent.right != None:
            pLastNodeInList = self.ConvertNode(pCurrent.right, pLastNodeInList)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert_YuHan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值