力扣题/二叉树/二叉树展开为链表

二叉树展开为链表

力扣原题

给你二叉树的根结点 root ,请你将它展开为一个单链表:

展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

示例 1:
在这里插入图片描述

输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {void} Do not return anything, modify root in-place instead.
 */
var flatten = function(root) {

    // 1.右节点,放到左节点的最右边叶子节点上
    // 2.左节点覆盖到右节点
    function dfs(node) {
        if(!node) return
        if(node.left) {
            const leftTail = treeRightTail(node.left) // 获取左节点的最右边叶子节点上
            leftTail.right = node.right // 最右边叶子节点的右子树挂载上原本的右节点
            node.right = node.left // 左节点覆盖到右节点
            node.left = null // 删除左子树
        }
        dfs(node.right) // 节点都移到右节点上了,只需要递归右节点
    }
    dfs(root)
};


function treeRightTail(node) {
    while(node.right) {
        node = node.right
    }
    return node
}

解题思路:

  1. 由于当前节点的左子节点会覆盖右子节点,所以需要把右子节点 暂存起来,但是由于使用dfs深度遍历,始终没有想到合适的暂存方法
  2. 仔细分析可以知道,左子节点的所有节点拼接完之后,才会开始拼接右子节点
  3. 而先序遍历,根左右,当前节点的最右边的叶子节点,一定是最后才遍历到的,所以可以把将右子节点放到左子节点最右边叶子节点右子树上,实现暂存

方法论

  • 解题尽量自己想,短时间想不出就直接看题解照搬,太难就跳过。
  • 不追求完美解题,能解就行。
  • 每天有空就来上一题,没空就算了,拒绝内耗。
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

温温温B

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

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

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

打赏作者

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

抵扣说明:

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

余额充值