day30-2022.11.26
题目信息来源
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm
来源:力扣(LeetCode)
剑指 Offer 36. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
知识点:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
题解1:个人解法
这个版本的做法比较简单粗暴,按照中序遍历的方法获得节点,并将其保存在 node_set
里面。之后对这个列表里的节点从头到尾遍历修改节点的连接方式。
这个方法需要遍历两次,深度遍历和列表的遍历,还有一个办法是深度遍历的同时修改节点的连接方式。
"""
# Definition for a Node.
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
"""
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:return
def searchTree(node):
if node.left:searchTree(node.left)
if node not in node_set:node_set.append(node)
else:return
if node.right:searchTree(node.right)
return
node_set = []
searchTree(root)
for i in range(len(node_set)):
node_set[i].left = node_set[i-1]
node_set[i].right = node_set[i+1] if i+1<len(node_set) else node_set[0]
return node_set[0]
题解2:个人解法
我其实一开始就是尝试了这个办法,但是测试总是返回两个值 {4,5},这个时候是把 tmp_node
作为参数传递的。然后调试发现这里的 tmp_node
变成了一开始递归的值,没有进行实际的修改。然后就考虑把这个变量变成全局的,但是报错了,再查发现是 global
用错了,函数内部也需要声明一下。
"""
# Definition for a Node.
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
"""
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:return
global tmp_node
def searchTree(node):
global tmp_node
if node.left:searchTree(node.left)
node.left = tmp_node
tmp_node.right = node
if node==tail_node:return
tmp_node = node
if node.right:searchTree(node.right)
return
tmp_node = root
while tmp_node:
if tmp_node.right:tmp_node = tmp_node.right
else:break
tail_node = tmp_node
searchTree(root)
return tail_node.right
题解:官方题解
官方题解和我区别在于没有初始化 pre
节点,我的方法是直接找到 max
,作为中序遍历会遇到的第一个值,也就是 min
的值的 pre
节点。所以这个也是比较好复现的。(ps,这样相比我的方法也少了一个 while)
同时可以学习的一个点是,它没有用 global
而是用 self
。
"""
# Definition for a Node.
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
"""
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:return
self.tmp_node = None
def searchTree(node):
if node.left:searchTree(node.left)
if not self.tmp_node:
self.head = node
else:
node.left = self.tmp_node
self.tmp_node.right = node
self.tmp_node = node
if node.right:searchTree(node.right)
return
searchTree(root)
self.tmp_node.right = self.head
self.head.left = self.tmp_node
return self.head