zoukankan      html  css  js  c++  java
  • 《剑指offer》---二叉搜索树与双向链表

    本文算法使用python3实现


    1 题目描述:

      输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
      时间限制:1s;空间限制:32768K


    2 思路描述:

      大致思路:按照题目所说,不能开辟新的节点,只能修改原节点的指针。所以可以大致想到,借助python中的列表,先把节点按序放进列表中,再对列表中的节点进行操作。
      具体步骤
        (1)当二叉搜索树为空时,返回的双向链表也应该为
        (2)当二叉搜索树只有一个根节点时,直接返回该根节点即可。
        (3)当不满足以上条件后,先将二叉搜索树按照中序遍历将其节点保存在列表中。此时列表里的节点是按照递增顺序排列。再从头至尾遍历列表里的节点,除第一个与最后一个节点外,其它节点的left指针指向列表上一个元素(节点),其right指针指向列表下一个元素(列表)。对于第一个节点,其left指针为None;列表最后一个节点的right指针为None


    3 程序代码:

    class Solution:
    	def Convert(self, pRootOfTree):
    	    # 借助列表
    	    # 当二叉搜索树为空时
    	    if pRootOfTree == None:
    	    	return None
    	    # 当二叉搜索树只有一个根节点时
    	    if pRootOfTree and not pRootOfTree.left and not pRootOfTree.right:
    	    	return pRootOfTree
    	    # 当二叉搜索树含有两个及以上节点时
    	    preList = []
    	    preList = self.PreOrder(pRootOfTree, preList)	
    	    preList[0].left = None
    	    preList[0].right = preList[1]
    	    for i in range(1,len(preList)-1):
    	    	preList[i].left = preList[i-1]
    	    	preList[i].right = preList[i+1]
    	    preList[-1].left = preList[-2]
    	    preList[-1].right = None
    	    head = preList[0]
    	    return head
    
    	def PreOrder(self, root, preList):
    		# 将节点按中序顺序保存到列表中
    		if root == None:
    			return
    		self.PreOrder(root.left, preList)
    		preList.append(root)
    		self.PreOrder(root.right, preList)
    		return preList
    
    
  • 相关阅读:
    两个多项式的卷积【NTT】
    Determinant【矩阵的行列式的求法】
    2020 CCPC 长春题解
    Easy Equation【差分+前缀和】
    CF1433G-Reducing Delivery Cost【最短路】
    Interstellar Hunter【2020CCPC秦皇岛-I】
    P4721 【模板】分治 FFT
    关于Spring事务传播行为的个人见解
    InnoDB MVCC实现原理整理
    Nginx学习笔记(五、Nginx缓存与限流)
  • 原文地址:https://www.cnblogs.com/lliuye/p/9150597.html
Copyright © 2011-2022 走看看