【剑指offer】二叉搜索树与双向链表(python)
思路:将所有结点中序遍历到一个列表,因为是左中右遍历,因为二叉搜索树自身的性质,所以遍历后就是升序的有序数组,这是再让每个结点(最后一个结点不用设置)的right设为下一个结点,left设为上一个结点。
1. python 的enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。返回 enumerate(枚举) 对象。
enumerate(sequence, [start=0])
2. a[:-1] 除了最后一个取全部。a[2::-1]) 取从下标为2的元素翻转读取。在“从头到尾打印链表”里,也有list切片操作。list[begin_idx: end_idx: step]对列表进行切片操作。从索引 begin_idx 开始,如果 step 为正则向右按 step 的值为步进切片至 end_idx 的前一个元素结束; 如果 step 为负则向左按 step 的值为步进切片至 end_idx 的前一个元素结束。arr[::-1]就是从头到尾按step=-1遍历,也就是从尾到头。
3. 别忘了self.arr清空
4. arr列表中的元素是链表节点,而且列表第一个元素就是双向链表头节点,所以直接返回 self.arr[0] 就相等于直接返回整个双向链表了。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: arr = [] def Convert(self, pRootOfTree): # write code here if not pRootOfTree: return self.arr = [] self.midTraversal(pRootOfTree) for index,node in enumerate(self.arr[:-1]): node.right = self.arr[index+1] self.arr[index+1].left = node return self.arr[0] def midTraversal(self,root): if not root: return self.midTraversal(root.left) self.arr.append(root) self.midTraversal(root.right)
直接遍历时修改指针:
# -*- 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 self.head = self.pre = None self.MidTraversal(pRootOfTree) return self.head def MidTraversal(self, root): if not root: return self.MidTraversal(root.left) if not self.head: self.head = self.pre = root else: self.pre.right, root.left, self.pre = root, self.pre, root self.MidTraversal(root.right)