LeetCode0114.二叉树展开为链表 Go语言AC笔记

 时间复杂度:O(n),空间复杂度:O(1)

解题思路

仿照官方题解寻找前驱结点的思路。

可以简单理解为三部曲:

  1. 找到根结点的右孩子的前驱结点。由于是先序遍历,右孩子的前驱结点就是根结点左孩子的最右结点。所以我们要先判断根结点是否有左孩子,如果有那么就找到左孩子的最右结点(特殊情况是其自身)
  2. 令刚刚找到的前驱结点的右孩子为根结点的右孩子。
  3. 根结点左右孩子交换,左孩子置空

AC代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func flatten(root *TreeNode)  {
    p:=root
    for p!=nil{
        if p.Left!=nil{
            pre:=p.Left//右节点的先驱节点
            for pre.Right!=nil{
                pre=pre.Right
            }
            pre.Right=p.Right
            p.Right=p.Left//根节点的左右节点交换
            p.Left=nil//根节点的左结点置空
        }
        p=p.Right
    }
}

感悟

只能想到先序遍历建树的方法,但是空间复杂度为O(n)。看了题解才反应过来原来可以通过找前驱结点的方法原地修改树,这也在提醒我要学会用逆向思维解题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值