剑指offer:二叉搜索树与双向链表

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

第一,中序遍历二叉搜索树后再遍历一遍修改指针指向

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        # 中序遍历二叉搜索树,左指针指向前一个结点,右指针指向后一个结点
        if not pRootOfTree:
            return None
        node = pRootOfTree
        nodelist=[]
        tree=[]
        while len(nodelist)!=0 or node:
            if node:
                nodelist.append(node)
                node=node.left
            else:
                node = nodelist.pop()
                tree.append(node)
                node=node.right
        #按中序遍历二叉树序列调整指针指向
        head = tree[0]
        while tree:
            node = tree.pop(0)
            if tree:
                node.right = tree[0]
                tree[0].left = node
        return head

第二,递归(参考大佬解法,留着以后加强理解)

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Convert(self, pRootOfTree):
        if not pRootOfTree:
            return None
        root = pRootOfTree
        leftHead = self.Convert(root.left)#先改变左子树,返回的是左子树根结点
        if leftHead:
            left = leftHead
            while left.right:#找到左子树的最右边结点
                left=left.right
            left.right=root
            root.left = left#根结点left指向左子树构成的链表最后一个结点
        rightHead = self.Convert(root.right)#改变右子树,返回右子树的根结点
        if rightHead:
            root.right = rightHead
            rightHead.left = root
        if leftHead:
            return leftHead
        else:
            return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值