- 两种方式都使用了个位数的额外存储空间,并且元素存储地址并没有发生变化,所以满足题意
非递归方法
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def convertBiNode(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
res = TreeNode(0) #作为返回树节点的头结点(只是一个中间元素)
pre = res #跟踪元素插入的位置
node = root
stack = list()
while node != None or len(stack) != 0:
if node != None:
stack.append(node)
node = node.left #不断将原始树节点的左子树拆开放入预先设置好的栈中
else:
node = stack.pop() #从栈中取出子树元素(子树中元素不一定是一个)
node.left = None
pre.right = node
pre = node #同 pre = pre.right 在这个地方只是一个位置的变换
node = node.right #切入到当前节点的右子树重新考虑子树是否有左子树的情况
return res.right
递归方法
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def convertBiNode(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
res = TreeNode(0)
self.order(root,res)
return res.right
def order(self,root,pre):
if root != None: #一直递归的判断子树是否存在左子树
pre = self.order(root.left,pre)
root.left = None
pre.right = root
pre = root #同pre = pre.right
pre = self.order(root.right,pre)
return pre