题目链接:
二叉树数据结构TreeNode
可用来表示单向链表(其中left
置空,right
为下一个链表节点)。实现一个方法,把二叉搜索树转换为单向链表,要求依然符合二叉搜索树的性质,转换操作应是原址的,也就是在原始的二叉搜索树上直接修改。返回转换后的单向链表的头节点
示例:
输入: [4,2,5,1,3,null,6,0] 输出: [0,null,1,null,2,null,3,null,4,null,5,null,6]
提示:
- 节点数量不会超过 100000。
-
要求是原址修改,即要直接利用这些已经存在的节点空间,修改指向来得到单向链表。
-
要求单向链表依然符合二叉搜索树的性质,说是单向链表,其实还是一棵特殊的二叉搜索树,只有右节点的二叉树。
-
众所周知,对二叉搜索树采用中序遍历就能得到一个升序序列。 那么如果我们在遍历过程中,修改每一个根节点的左右指向,不就实现了原址修改了吗。
解题思路:#可以采用的方法:递归法实现、栈算法实现、中序遍历、深度优先搜索、二叉查找树、分治、动态规划、链表、数组。
### 明天计划:二叉查找树
#示例:[4,2,5,1,3,null,6,0]
@我的思路的代码,但是太占内存了。还没有进一步优化代码。
存在的问题,重建的节点,没在原址上进行修改,所以超内存。
class TreeNode:
def __init__(self,x):
self.val=x
self.left=None
self.right=None
class Solution:
def convertBiNode(self, root: TreeNode):
if not root :return None
##使用中序遍历加上递归操作
def DFS_(root):
#先找到最后一个左节点,然后创建树,每次都向里面添加右节点。
if not root: return None
myStack=[]#存储根节点,其实是一个栈,输出方式应该为左节点-根节点-右节点
node = root
tree_final = None
cur_node = None # 初始化当前节点为None
while node or myStack:
while node:
myStack.append(node)
node=node.left
# print(myStack)
node=myStack.pop()
if not tree_final:
tree_final=TreeNode(node.val)
cur_node=tree_final
else:
cur_