描述
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
思路
1. 递归算法 前序遍历 先把root右子树全部放到左子树的最右节点的右指针, 然后把左子树放到root的右指针
实现
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func Flatten(root *TreeNode) {
if root == nil{
return
}
Flatten(root.Left)
Flatten(root.Right)
if root.Left != nil{
// 找到左子树的最右子树rightEnd 将左子树放到右子树的位置 并将右子树放到rightEnd的右子树位置
rightEnd := root.Left
for rightEnd.Right != nil{
rightEnd = rightEnd.Right
}
tmp := root.Right
root.Right = root.Left
root.Left = nil
rightEnd.Right = tmp
}
}