Flatten Binary Tree to Linked List
Flatten a binary tree to a fake "linked list" in pre-order traversal.
Here we use the right pointer in TreeNode as the next pointer in ListNode.
Given
1
/ \
2 5
/ \ \
3 4 6
The flattened tree should look like:
1
\
2
\
3
\
4
\
5
\
6
分析:
把所有的树节点按照PRE-ORDER的顺序存在ArrayList里面,然后遍历ArrayList里的节点,调整它们的left and right child指针。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: a TreeNode, the root of the binary tree
* @return: nothing
* cnblogs.com/beiyeqingteng
*/
public void flatten(TreeNode root) {
// write your code here
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
preOrder(root, list); for (int i = ; i < list.size(); i++) {
list.get(i).left = null;
if (i == list.size() - ) {
list.get(i).right = null;
} else {
list.get(i).right = list.get(i + );
}
}
} public void preOrder(TreeNode root, ArrayList<TreeNode> list) {
if (root != null) {
list.add(root);
preOrder(root.left, list);
preOrder(root.right, list);
}
}
}
自己后来写出的方法:
 public class Solution {
     public void flatten(TreeNode root) {
         helper(root);
     }
     public TreeNode helper(TreeNode root) {
         if (root == null) return root;
         TreeNode leftHead = helper(root.left);
         TreeNode rightHead = helper(root.right);
         root.left = null;
         if (leftHead != null) {
             root.right = leftHead;
             TreeNode current = root;
             while (current.right != null) {
                 current = current.right;
             }
             current.right = rightHead;
         }
         return root;
     }
 }
还有一种是递归的方式,下面的方法参考了另一个网友的做法,觉得这种方法非常容易理解,而且具有一般性。
解法2:递归构建
假设某节点的左右子树T(root->left)和T(root->right)已经flatten成linked list了:
1
  /    \
 2     5
  \       \
   3      6 <- rightTail
     \
      4  <- leftTail
如何将root、T(root->left)、T(root->right) flatten成一整个linked list?显而易见:
temp = root->right
root->right  = root->left
root->left = NULL
leftTail->right = temp
这里需要用到已经flatten的linked list的尾部元素leftTail, rightTail。所以递归返回值应该是生成的整个linked list的尾部。
 class Solution {
     public void flatten(TreeNode root) {
         flattenBT(root);
     }
     TreeNode flattenBT(TreeNode root) {
         if(root == null) return null;
         TreeNode leftTail = flattenBT(root.left);
         TreeNode rightTail = flattenBT(root.right);
10         if(root.left != null) {
             TreeNode temp = root.right;
             root.right = root.left;
             root.left = null;
             leftTail.right = temp;
         }
17         if(rightTail != null) return rightTail;
18         if(leftTail != null) return leftTail;
19         return root;
     }
 }
需注意几个细节
ln 10:只有当左子树存在时才将它插入右子树中
ln 17-19:返回尾部元素时,需要特殊处理 (1) 有右子树的情况,(2) 无右子树但有左子树的情况,(3)左右子树均不存在的情况。
Reference:
http://bangbingsyb.blogspot.com/2014/11/leetcode-flatten-binary-tree-to-linked.html
Flatten Binary Tree to Linked List的更多相关文章
- [LintCode] Flatten Binary Tree to Linked List 将二叉树展开成链表
		Flatten a binary tree to a fake "linked list" in pre-order traversal. Here we use the righ ... 
- 31. Flatten Binary Tree to Linked List
		Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ... 
- Flatten Binary Tree to Linked List (LeetCode #114 Medium)(LintCode #453 Easy)
		114. Flatten Binary Tree to Linked List (Medium) 453. Flatten Binary Tree to Linked List (Easy) 解法1: ... 
- 【LeetCode】Flatten Binary Tree to Linked List
		随笔一记,留做重温! Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-pl ... 
- 114. Flatten Binary Tree to Linked List(M)
		. Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ... 
- LeetCode 114| Flatten Binary Tree to Linked List(二叉树转化成链表)
		题目 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 解析 通过递归实现:可以用先序遍历, ... 
- Leetcode:Flatten Binary Tree to Linked List  解题报告
		Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ... 
- [LeetCode]Flatten Binary Tree to Linked List题解(二叉树)
		Flatten Binary Tree to Linked List: Given a binary tree, flatten it to a linked list in-place. For e ... 
- 【LeetCode】114. Flatten Binary Tree to Linked List
		Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-place. For ex ... 
- leetcode dfs Flatten Binary Tree to Linked List
		Flatten Binary Tree to Linked List Total Accepted: 25034 Total Submissions: 88947My Submissions Give ... 
随机推荐
- 教你一步一步实现一个Promise
			Promise我想现在大家都非常熟悉了,主要作用就是解决异步回调问题,这里简单介绍下. Promise规范是CommonJS规范之一,而Promise规范又分了好多种,比如 Promises/A.Pr ... 
- android 6.0 SDK中删除HttpClient的相关类的解决方法
			一.出现的情况 在eclipse或 android studio开发, 设置android SDK的编译版本为23时,且使用了httpClient相关类的库项目:如android-async-http ... 
- BRIEF算法
			本文结构 为了看懂ORB特征提取算法,来看了BRIEF算法的原文,并查看了OpenCV中BRIEF的相关实现,来验证论文的解读正确与否. BRIEF论文解读 摘要 用二进制串描述局部特征,好处有二:一 ... 
- 洛谷P1156 垃圾陷阱
			动规仍然是难关啊 题目描述 卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中.“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺. 卡门想 ... 
- Sublime Text 3 笔记
			Nearly all of the interesting files for users live under the data directory. The data directory is ~ ... 
- 在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
			http://www.cnblogs.com/huangtailang/p/4221164.html 背景:个人电脑中使用的是VS2012,数据库为2008R2,最近需要打开一个SqlServer20 ... 
- tmux下的滚屏
			先Ctrl+b进入tmux的操作模式,然后用PageUp和PageDown, 
- std::shared_ptr(二)
			Defined in header <memory> template< class T > class shared_ptr; (since C++11) ... 
- std::auto_ptr
			auto_ptr是C++标准库中(<utility>)为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII,在构造的 ... 
- 关于Java单例
			参考资料:http://blog.csdn.net/haoel/article/details/4028232 public class SingletonTest implements Runnab ... 
