LeetCode - Medium - 114. Flatten Binary Tree to Linked List

Topic

  • Tree
  • Depth-first Search

Description

https://leetcode.com/problems/flatten-binary-tree-to-linked-list/

Given the root of a binary tree, flatten the tree into a “linked list”:

The “linked list” should use the same TreeNode class where the right child pointer points to the next node in the list and the left child pointer is always null.
The “linked list” should be in the same order as a pre-order traversal of the binary tree.

Example 1:

Input: root = [1,2,5,3,4,null,6]
Output: [1,null,2,null,3,null,4,null,5,null,6]

Example 2:

Input: root = []
Output: []

Example 3:

Input: root = [0]
Output: [0]

Constraints:

  • The number of nodes in the tree is in the range [0, 2000].
  • -100 <= Node.val <= 100

Follow up: Can you flatten the tree in-place (with O(1) extra space)?

Analysis

方法一:我写的,用到二叉树前序遍历模式的递归法。

方法二:别人写的,很简洁。

方法三:别人写的,跟方法一的核心思想类似,区别在于本方法只用单一方法就搞定。

方法四:别人写的,迭代法。

Submission

package com.lun.medium;import java.util.LinkedList;import com.lun.util.BinaryTree.TreeNode;public class FlattenBinaryTreeToLinkedList {//方法一:我写的,用到二叉树前序遍历模式的递归法public void flatten(TreeNode root) {flattenHelper(root);}private TreeNode flattenHelper(TreeNode node) {if(node == null)return null;TreeNode left = node.left; TreeNode right = node.right;node.left = null;node.right = flattenHelper(left);TreeNode p = node;while(p.right != null)p = p.right;p.right = flattenHelper(right);    	return node;}//方法二:别人写的,很简洁private TreeNode prev = null;public void flatten2(TreeNode root) {if (root == null)return;flatten2(root.right);flatten2(root.left);root.right = prev;root.left = null;prev = root;}public void setPrevNull() {this.prev = null;}//方法三:别人写的,跟方法一的核心思想类似,区别在于本方法只用单一方法就搞定public void flatten3(TreeNode root) {if (root == null) return;TreeNode left = root.left;TreeNode right = root.right;root.left = null;flatten(left);flatten(right);root.right = left;TreeNode cur = root;while (cur.right != null) cur = cur.right;cur.right = right;}//方法四:别人写的,迭代法public void flatten4(TreeNode root) {if (root == null) return;LinkedList<TreeNode> stk = new LinkedList<>();stk.push(root);while (!stk.isEmpty()){TreeNode curr = stk.pop();if (curr.right!=null)  stk.push(curr.right);if (curr.left!=null)  stk.push(curr.left);if (!stk.isEmpty()) curr.right = stk.peek();curr.left = null;  // dont forget this!! }}}

Test

import static org.junit.Assert.*;
import org.junit.Test;import com.lun.util.BinaryTree;
import com.lun.util.BinaryTree.TreeNode;public class FlattenBinaryTreeToLinkedListTest {@Testpublic void test() {FlattenBinaryTreeToLinkedList obj = new FlattenBinaryTreeToLinkedList();TreeNode root1 = BinaryTree.integers2BinaryTree(1, 2, 5, 3, 4, null, 6);obj.flatten(root1);TreeNode expected1 = BinaryTree.integers2BinaryTree(1, null, 2, null, 3, null, 4, null, 5, null, 6);assertTrue(BinaryTree.equals(root1, expected1));TreeNode root2 = null;obj.flatten(root2);assertNull(root2);TreeNode root3 = BinaryTree.integers2BinaryTree(0);obj.flatten(root3);TreeNode expected3 = BinaryTree.integers2BinaryTree(0);assertTrue(BinaryTree.equals(root3, expected3));}@Testpublic void test2() {FlattenBinaryTreeToLinkedList obj = new FlattenBinaryTreeToLinkedList();TreeNode root1 = BinaryTree.integers2BinaryTree(1, 2, 5, 3, 4, null, 6);obj.flatten2(root1);TreeNode expected1 = BinaryTree.integers2BinaryTree(1, null, 2, null, 3, null, 4, null, 5, null, 6);assertTrue(BinaryTree.equals(root1, expected1));obj.setPrevNull();TreeNode root2 = null;obj.flatten2(root2);assertNull(root2);obj.setPrevNull();TreeNode root3 = BinaryTree.integers2BinaryTree(0);obj.flatten2(root3);TreeNode expected3 = BinaryTree.integers2BinaryTree(0);assertTrue(BinaryTree.equals(root3, expected3));}@Testpublic void test3() {FlattenBinaryTreeToLinkedList obj = new FlattenBinaryTreeToLinkedList();TreeNode root1 = BinaryTree.integers2BinaryTree(1, 2, 5, 3, 4, null, 6);obj.flatten3(root1);TreeNode expected1 = BinaryTree.integers2BinaryTree(1, null, 2, null, 3, null, 4, null, 5, null, 6);assertTrue(BinaryTree.equals(root1, expected1));TreeNode root2 = null;obj.flatten3(root2);assertNull(root2);TreeNode root3 = BinaryTree.integers2BinaryTree(0);obj.flatten3(root3);TreeNode expected3 = BinaryTree.integers2BinaryTree(0);assertTrue(BinaryTree.equals(root3, expected3));}@Testpublic void test4() {FlattenBinaryTreeToLinkedList obj = new FlattenBinaryTreeToLinkedList();TreeNode root1 = BinaryTree.integers2BinaryTree(1, 2, 5, 3, 4, null, 6);obj.flatten4(root1);TreeNode expected1 = BinaryTree.integers2BinaryTree(1, null, 2, null, 3, null, 4, null, 5, null, 6);assertTrue(BinaryTree.equals(root1, expected1));TreeNode root2 = null;obj.flatten4(root2);assertNull(root2);TreeNode root3 = BinaryTree.integers2BinaryTree(0);obj.flatten4(root3);TreeNode expected3 = BinaryTree.integers2BinaryTree(0);assertTrue(BinaryTree.equals(root3, expected3));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单暴力到dp的优化(初级篇)

一、一维非脑残 1 一个只包含A、B和C的字符串&#xff0c;如果存在某一段长度为3的连续子串中恰好A、B和C各有一个&#xff0c;那么这个字符串就是纯净的&#xff0c;否则这个字符串就是暗黑的。例如&#xff1a;BAACAACCBAAA 连续子串"CBA"中包含了A,B,C各一个&am…

ccpc河北大学生程序设计竞赛dp小总结

近期题目来自校赛&#xff0c;赛前训练&#xff0c;省赛热身&#xff0c;河北ccpc正式比赛。 题目一&#xff1a; 题目描述&#xff1a; 由于第m个台阶上有好吃的薯条&#xff0c;所以薯片现在要爬一段m阶的楼梯. 薯片每步最多能爬k个阶梯&#xff0c;但是每到了第i个台阶&a…

第一次课 优秀作业展示

18级河北师大软件编程训练 很多同学非常认真的完成了作业&#xff0c;这里选出比较优秀的作业展示出来。 注&#xff1a;展示顺序不是排名 为了尊重同学们的劳动成果&#xff0c;并没有要代码&#xff0c;只是截图展示。 范天祚 &#xff08;傻兔子&#xff09; 熊静祎&…

二分查找及一般拓展总结

二分-不止是查找哦 二分过程&#xff1a;首先&#xff0c;假设表中元素是按升序排列&#xff0c;将表中间位置记录的关键字与查找关键字比较&#xff0c;如果两者相等&#xff0c;则查找成功&#xff1b;否则利用中间位置记录将表分成前、后两个子表&#xff0c;如果中间位置记…

排序算法基本介绍及python实现(含详细注释)

对数组排序可以说是编程基础中的基础&#xff0c;本文对八种排序方法做简要介绍并用python实现。 代码中注释很全&#xff0c;适合复习和萌新学习。这是刚入学自己写的&#xff0c;可能难免比不上标准的写法&#xff0c;但是懒得改了。 文末会放和排序相关的基本拓展总结链接…

二叉搜索树实现

本文给出二叉搜索树介绍和实现 首先说它的性质&#xff1a;所有的节点都满足&#xff0c;左子树上所有的节点都比自己小&#xff0c;右边的都比自己大。 那这个结构有什么有用呢&#xff1f; 首先可以快速二分查找。还可以中序遍历得到升序序列&#xff0c;等等。。。 基本操…

快排-荷兰国旗

在使用partition-exchange排序算法时&#xff0c;如快速排序算法&#xff0c;我们会遇到一些问题&#xff0c;比如重复元素太多&#xff0c;降低了效率&#xff0c;在每次递归中&#xff0c;左边部分是空的(没有元素比关键元素小)&#xff0c;而右边部分只能一个一个递减移动。…

时间空间复杂度概述

找个时间写一写时间复杂度和一些问题分类&#xff0c;也普及一下这方面知识。 如何衡量一个算法好坏 很显然&#xff0c;最重要的两个指标&#xff1a;需要多久可以解决问题、解决问题耗费了多少资源 那我们首先说第一个问题&#xff0c;要多长时间来解决某个问题。那我们可…

二叉树遍历算法总结

文章目录前提要素深度优先搜索DFS经典遍历算法前序遍历递归版迭代版中序遍历递归版迭代版后序遍历递归版迭代版Morris遍历算法中序遍历前序遍历后序遍历广度优先搜索BFS按层遍历参考资料前提要素 本文代码用Java实现。 //二叉树节点结构 public static class TreeNode {publi…

线段树简单实现

首先&#xff0c;线段树是一棵满二叉树。&#xff08;每个节点要么有两个孩子&#xff0c;要么是深度相同的叶子节点&#xff09; 每个节点维护某个区间&#xff0c;根维护所有的。 如图&#xff0c;区间是二分父的区间。 当有n个元素&#xff0c;初始化需要o(n)时间&#xf…

树状数组实现

树状数组能够完成如下操作&#xff1a; 给一个序列a0-an 计算前i项和 对某个值加x 时间o(logn) 注意&#xff1a;有人觉得前缀和就行了&#xff0c;但是你还要维护啊&#xff0c;改变某个值&#xff0c;一个一个改变前缀和就是o(n)了。 线段树树状数组的题就是这样&#x…

KMP子字符串匹配算法学习笔记

文章目录学习资源什么是KMP什么是前缀表为什么一定要用前缀表如何计算前缀表前缀表有什么问题使用next数组来匹配放码过来构造next数组一、初始化二、处理前后缀不相同的情况三、处理前后缀相同的情况使用next数组来做匹配代码总览测试代码时间复杂度分析学习资源 字符串&…

内存分区

之前一直比较懵&#xff0c;想想还是单独写一个短篇来记录吧 一般内存主要分为&#xff1a;代码区、常量区、静态区&#xff08;全局区&#xff09;、堆区、栈区这几个区域。 代码区&#xff1a;存放程序的代码&#xff0c;即CPU执行的机器指令&#xff0c;并且是只读的。 常…

数据结构课上笔记5

介绍了链表和基本操作 用一组物理位置任意的存储单元来存放线性表的数据元素。 这组存储单元既可以是连续的&#xff0c;也可以是不连续的&#xff0c;甚至是零散分布在内存中的任意位置上的。因此&#xff0c;链表中元素的逻辑次序和 物理次序不一定相同。 定义&#xff1a; …

Java设计模式(2 / 23):观察者模式

定义 观察者&#xff08;Observer&#xff09;模式定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对象改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新。 OO设计原则&#xff1a;为了交互对象之间的松耦合设计而努力。 案例&#xff1a;气…

二叉树概述

各种实现和应用以后放链接 一、二叉树的基本概念 二叉树&#xff1a;二叉树是每个节点最多有两个子树的树结构。 根节点&#xff1a;一棵树最上面的节点称为根节点。 父节点、子节点&#xff1a;如果一个节点下面连接多个节点&#xff0c;那么该节点称为父节点&#xff0c;它…

Java设计模式(1 / 23):策略模式

定义 策略&#xff08;Strategy&#xff09;模式定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换 &#xff0c;此模式让算法的变化独立于使用算法的客户。 案例&#xff1a;模拟鸭子应用 一开始 新需求&#xff1a;模拟程序需要会飞的鸭子 在父类新…

Java设计模式(3 / 23):装饰者模式

文章目录定义案例1&#xff1a;三点几啦首次尝试再次尝试设计原则&#xff1a;类应该对扩展开放&#xff0c;对修改关闭尝用装饰者模式装饰者模式特征本例的类图放码过来饮料类HouseBlendDarkRoastEspressoDecaf调料装饰类MilkMochaSoyWhip运行测试类案例2&#xff1a;编写自己…

c语言知识体系

原文&#xff1a;https://blog.csdn.net/lf_2016/article/details/80126296#comments