力扣114. 二叉树展开为链表(java,用树模拟链表)

Problem: 114. 二叉树展开为链表

文章目录

题目描述

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

1.展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。

2/展开后的单链表应该与二叉树 先序遍历 顺序相同。


思路

我们易知,树与链表两种数据结构都可以通过指针操作 来实现,换一句说两种数据结构都可以归结为一种链式数据结构 只不过一般情况下,一般普通链表每一个节点后都只有一个next指针 ;一般的二叉树每个节点后都会有两个指针left指针和right指针,所以我们即可想到使用一个树来模拟实现链表!!!

1.创建虚拟头节点和尾指针,尾指针初始化指向虚拟头节点。

2.每次遍历过程中将上一节点的right指针指向当前节点,上一节点的left指针置为null

解题方法

1.创建虚拟头节点和尾指针,尾指针初始化指向虚拟头节点。

2.编写辅助的前序遍历函数,每次先取出当前节点的左右子树,再将每次按先序遍历的到的节点添加到尾指针后

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( 1 ) O(1) O(1)

Code

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //创建虚拟头节点
    private TreeNode dummyHead = new TreeNode();
    //创建尾指针
    private TreeNode tail = dummyHead;

    /**
     * 将一个二叉树展开为一个单链表
     *
     * @param root 树的根节点
     */
    public void flatten(TreeNode root) {
        preOrder(root);
    }

    /**
     * 先序遍历,将每次遍历到的节点添加到链表中
     *
     * @param root 树的根节点
     */
    private void preOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        //先取出当前节点的左右节点
        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;
        //把遍历到的节点放在链表中
        tail.right = root;
        tail = root;
        tail.left = null;

        preOrder(leftNode);
        preOrder(rightNode);
    }

}
相关推荐
苏瞳儿19 小时前
java对数据库的增删改查
java·数据库·oracle
zhangjw3419 小时前
Java基础语法:变量、数据类型与运算符,从原理到实战
java·开发语言
yaoxin5211231 天前
384. Java IO API - Java 文件复制工具:Copy 示例完整解析
java·开发语言·python
NotFound4861 天前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
木子墨5161 天前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
一 乐1 天前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
鱼鳞_1 天前
Java学习笔记_Day29(异常)
java·笔记·学习
烟锁池塘柳01 天前
一文讲透 C++ / Java 中方法重载(Overload)与方法重写(Override)在调用时机等方面的区别
java·c++·面向对象
一叶飘零_sweeeet1 天前
深入拆解 Fork/Join 框架:核心原理、分治模型与参数调优实战
java·并发编程
云烟成雨TD1 天前
Spring AI Alibaba 1.x 系列【23】短期记忆
java·人工智能·spring