二叉搜索树与双向列表

二叉搜索树与双向列表

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

思路:

a> 二叉搜索树的中序遍历是一个不减的排序结果,因此先将二叉树搜索树中序遍历
b> 将遍历后的结果用相应的指针连接起来

代码:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def Convert(self, pRootOfTree):
        global li
        li = []
        self.mid_travel(pRootOfTree)
        #没有节点
        if not pRootOfTree:
            return None
        #只有一个节点
        if len(li) == 1:
            return pRootOfTree

        # 多个节点
        # 头结点
        li[0].left = None
        li[0].right = li[1]
        # 尾节点
        li[-1].left = li[-2]
        li[-1].right = None
        # 中间节点
        for i in range(1,len(li)-1):
            li[i].left = li[i - 1]
            li[i].right = li[i + 1]
        return li[0]

    def mid_travel(self, root):
        if not root:
            return None
        self.mid_travel(root.left)
        li.append(root)
        self.mid_travel(root.right)

if __name__ == '__main__':
    s = Solution()
    t12 = TreeNode(12)
    t5 = TreeNode(5)
    t18 = TreeNode(18)
    t2 = TreeNode(2)
    t9 = TreeNode(9)
    t15 = TreeNode(15)
    t19 = TreeNode(19)
    t17 = TreeNode(17)
    t16 = TreeNode(16)
    # 开始创建树
    t12.left = t5
    t12.right = t18
    t5.left = t2
    t5.right = t9
    t18.left = t15
    t18.right = t19
    t15.right = t17
    t17.left = t16
    # 调试方法

    head = s.Convert(t12)
    cur = head
    while cur:
        print(cur.val, end=' ')
        cur = cur.right
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值