从题目的例子中看, 它是这样的一个转换过程:
1 左子树经过转换后放到父节点的右节点上
2 原来的右节点进行相同的转换, 然后接到 1 中的最后一个节点上去
还是一个递归的过程
除了过程中的判断有点繁琐之后, 思路上并不困难
def flatten(root: TreeNode): Unit = {
def go(node:TreeNode): TreeNode = {
if(node == null) null
else {
val flattenLeft = go(node.left)
val flattenRight = go(node.right)
if(flattenLeft != null){ //如果转换后的左子树不为空
node.left = null //先去掉原来的左子树
if(flattenRight == null) { // 如果本来没有右子树, 直接将转换后的左子树拼接上去
node.right = flattenLeft
} else { // 如果原来有右子树, 接上转换后的左子树
node.right = flattenLeft
var rightLast = flattenLeft
while(rightLast.right != null){ // 找到左子树的最右节点
rightLast = rightLast.right
}
rightLast.right = flattenRight //然后把转换后的右子树拼接到最右节点上
}
}
node
}
}
go(root)
}