首页 > 其他分享 >力扣-114-二叉树展开为链表

力扣-114-二叉树展开为链表

时间:2022-12-14 09:11:18浏览次数:38  
标签:力扣 遍历 链表 二叉树 flatten 指针 root 先序

  1. 按照先序遍历展开
  2. 展开后仍然为TreeNode,只是左孩子指针一律置空

关键在于这个先序的访问过程与各个节点指针的修改操作如何统一不冲突

首先就可以排除先序遍历,瞄一眼评论其实是可以先遍历右边,从后往前构造的(我也有点这想法,之前反转链表就有这种从后往前的递归思路,只是不太好想)

public:
	// 使用一个指针保存了最后一个节点
	TreeNode* lastNode = nullptr;
	void flatten(TreeNode* root) {
		if (!root) return;
		flatten(root->right);
		flatten(root->left);
		root->right = lastNode;
		root->left = nullptr;
		lastNode = root;
	}

起码看起来非常优雅简洁,使用了额外的指针保存上一个(最后操作)节点,配合右左根的遍历方式,实现从后往前拼接链表

但是遗憾的是这不是一个原地算法

原地怎么做呢?前面说了,先序肯定是不行的,那就考虑后序

标签:力扣,遍历,链表,二叉树,flatten,指针,root,先序
From: https://www.cnblogs.com/yaocy/p/16979051.html

相关文章

  • 链表--删除链表的中间节点
    题目:给定链表的头节点,实现删除链表的中间节点的函数例如:不删除任何节点1->2删除节点21->2->3删除节点21->2->3->4删除节点21->2->3->4->5删除节点31->2->3->4->5......
  • 链表与list
    1.链表实现特点:每一个节点都是在堆内存上独立new出来的,节点内存不连续。即逻辑地址连续,而物理地址不连续。优点:内存利用率高,不需要大块连续内存插入和删除节点......
  • 力扣 剑指offer05 替换空格
    题目:请实现一个函数,把字符串s中的每个空格替换成"%20"。示例:输入:s="Wearehappy."输出:"We%20are%20happy."思路:直接的思路就是:使用一个新的对象,复制str,复......
  • 力扣541 反转字符串2
    题目:给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符......
  • 线性表(链表,顺序表)讲解_legend
    线性表(linearList)(1)线性表的定义:节点(node)之间具有一对一的前驱后继关系(2)线性表的存储结构:(2.1)顺序表(sequenceList):(2.2)链式表(linkList):(3)顺序表的常见操作:(初始化+增删改......
  • 单链表的扩展操作21----legend050709
    单链表的操作之补充: (1).单链表的反转: (2).单链表的排序(插入排序,选择排序,冒泡排序等): (3).单链表取得最小值的节点,及其前驱: (4).单链表获取最小的k个节点:(4-1)单链表......
  • 力扣-31-下一个排列
    很明显,对于一个排列而言,最后一个位置是动不了的那么就从倒数第二个位置开始用递归一点点分析错了几次之后终于自己写出来了(叉腰骄傲)voidnextPermutation(vector<int>&......
  • 数据结构 线索二叉树
    一、线索二叉树的原理    通过考察各种二叉链表,不管儿叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n各结点的二叉链表共有2n个链域,非空链域为n-1个,......
  • 力扣-49-字母异位词分组
    字母异位词就是:组成单词的字母相同,只是字母位置不同的单词没什么思路,朴素思路,先全部放到set里,然后不空就取一个出来,回溯构造所有的异位词和set中匹配public:vector<......
  • 力扣每日一题2022.12.12---1832. 判断句子是否为全字母句
    全字母句指包含英语字母表中每个字母至少一次的句子。给你一个仅由小写英文字母组成的字符串sentence,请你判断 sentence是否为全字母句。如果是,返回true;否则,返回......