给定一个二叉树,原地将它展开为链表。

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

给定一个二叉树,原地将它展开为链表。

例如,给定二叉树

1

/
2 5
/ \
3 4 6
将其展开为:

1

2

3

4

5

6

思路:可以发现展开的顺序其实就是二叉树的先序遍历。算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题。
将左子树插入到右子树的地方
将原来的右子树接到左子树的最右边节点
考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null

可以看图理解下这个过程。

Java
    1
   / \
  2   5
 / \   \
3   4   6

//将 1 的左子树插入到右子树的地方
    1
     \
      2         5
     / \         \
    3   4         6        
//将原来的右子树接到左子树的最右边节点
    1
     \
      2          
     / \          
    3   4  
         \
          5
           \
            6
            
 //将 2 的左子树插入到右子树的地方
    1
     \
      2          
       \          
        3       4  
                 \
                  5
                   \
                    6   
        
 //将原来的右子树接到左子树的最右边节点
    1
     \
      2          
       \          
        3      
         \
          4  
           \
            5
             \
              6 

public void flatten(TreeNode root) {
    while (root != null) { 
        //左子树为 null,直接考虑下一个节点
        if (root.left == null) {
            root = root.right;
        } else {
            // 找左子树最右边的节点
            TreeNode pre = root.left;
            while (pre.right != null) {
                pre = pre.right;
            } 
            //将原来的右子树接到左子树的最右边节点
            pre.right = root.right;
            // 将左子树插入到右子树的地方
            root.right = root.left;
            root.left = null;
            // 考虑下一个节点
            root = root.right;
        }
    }
}
给定一个二叉树原地将它展开一个链表 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} *. 阅读详情

相关推荐

114. 二叉树展开链表

给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 前序遍历二叉树同时分别将左右子树压入栈中 /** * Definition...

码奴生来就只知道前进 657

将一颗二叉树展开链表

题目描述: 给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 代码如下: /** * Definition for a binar...

Light丶Long的博客 278

leetcode 114. 二叉树展开链表

题目描述: 给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 代码:、 方法一、后序遍历递归。 class Solut...

行走巨人国 3942

Leetcode 114:二叉树展开链表(超详细的解法!!!)

给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路 这个问题非常简单。 我们先要找到root.left的最...

coordinate的博客 1801

【LeetCode刷题(中等程度)】114. 二叉树展开链表

给定一个二叉树原地将它展开一个链表。 例如,给定二叉树 将其展开为: 思路如上图。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x

qq_33197518的博客 175

20190413-Leetcode-114.二叉树展开链表

leetcode-114.二叉树展开链表 给定一个二叉树原地将它展开链表。 例如,给定二叉树 将其展开为: 思路1:把所有树的所有结点先序遍历放在vector中,然后依次连接,连接所有的结点。 代码1: class Solution { public: void preorder(TreeNode* root, vector<TreeNode* >& tree...

WangXu__的博客 192

二叉树展开链表

二叉树展开链表 题目: 给定一个二叉树原地将它展开一个链表。 例如,给定二叉树 将其展开为: 解题思路:运用前序遍历将节点添加进list中,然后遍历list改变每一个节点的左右节点 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * T

KobeSacre的博客 166

【leetcode】114 二叉树展开链表二叉树链表

题目描述 给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 思路 注意题目要求是单向链表,需要将所有的left指针置为null。 1 非递归 ...

zjwreal 455

LeetCode 热题 C++ 114. 二叉树展开链表

给你二叉树的根结点rootTreeNoderightnullroot = [][]root = [0][0][0, 2000]你可以使用原地算法(O(1)额外空间)展开这棵树吗?

做题记录 637

【leetcode热题】二叉树展开链表

先序遍历,始终记录下前一个节点,然后将当前节点接在前一个节点的右孩子上。是不存在的),可以随意给 last 初始化一个节点,这并不影响结果。为了避免初始阶段 last 为空(即开始的时候。

kiugvui的博客 547

【LeetCode】二叉树展开链表 [M](Morris遍历)

LeetCode 114:给你二叉树的根结点 root ,请你将它展开一个链表展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 采用Morris遍历求解。

小七的博客 155

leetcode 114. Flatten Binary Tree to Linked List 二叉树展开链表(简单)

思路:非迭代版实现,从根节点开始出发,先检测其左子节点是否存在,如存在则将根节点和其右节点断开,将左子节点及其后面所有结构一起连接到右子节点的位置,把原右子节点连到原左子节点为最后面的右子节点之后。

ln_ydc的专栏 201

【C++】每日一题 114 二叉树展开链表

如果不为空,则找到左子树的最右节点(即左子树中最右边的节点),然后将根节点的右子树接到左子树的最右节点上,接着将整个左子树移到根节点的右子树位置。最后,处理下一个节点,直到遍历完整个二叉树。Morris 遍历算法是一种遍历二叉树的方法,其核心思想是通过线索化二叉树的空闲指针,使得可以在不使用额外空间的情况下遍历整个二叉树展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null。展开后的单链表应该与二叉树 先序遍历 顺序相同。

ZSZ_shsf的博客 374

LeetCode 114. 二叉树展开链表

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

???的博客 80

114. Flatten Binary Tree to Linked List (Medium)

114. Flatten Binary Tree to Linked List (Medium)

还是需要多学习!闷声大发财,这是坠吼的! 498

Flatten Binary Tree to Linked List

后序遍历、二叉树节点与链表、将一颗二叉树平铺为一个链表

不积跬步无以至千里 231

LeetCode-114. 二叉树展开链表

114.二叉树展开链表 给定一个二叉树原地将它展开链表。 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解题思路:先得到二叉树前序遍历结果result,然后...

章小幽的博客 237
上一篇: 浅谈进程、线程和协程三者之间的区别和联系
下一篇: 面试中可以问面试官的问题
超人不会飞、
博客等级 码龄10年 13粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值