题目描述
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
题解1
方案1是前序遍历一遍树,在遍历时把树的节点加入一个数组中。然后遍历一遍数组,让每个节点的左子节点都是空,右子节点是下一个节点。由于操作的都是指针,所以都会反应到root上。
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
var res []*TreeNode
func flatten(root *TreeNode) {
var prev *TreeNode
preOrderTraversal(root)
for i, node := range res {
if i == 0 {
prev = node
continue
}
prev.Left = nil
prev.Right = node
prev = node
}
}
func preOrderTraversal(root *TreeNode) {
if root == nil {
return
}
res = append(res, root)
preOrderTraversal(root.Left)
preOrderTraversal(root.Right)
}
题解2
方案2是用分解问题的思路。首先把左子树和右子树都展平。然后如果存在左子节点,就让左子树最右边的节点指向根节点的右子节点,再让根节点的右边指向左子节点,最后让根节点左子节点为空。
/**
* 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 {
left := root.Left
root.Left = nil
right := root.Right
root.Right = left
for left.Right != nil {
left = left.Right
}
left.Right = right
}
}
文章介绍了如何将给定的二叉树转换为单链表,提供了两种方法:一是通过前序遍历存储节点并调整左右指针;二是先递归展开左右子树,然后连接根节点和左子树的末尾。

814

被折叠的 条评论
为什么被折叠?



