Flatten Binary Tree to Linked List
2015-07-17 09:21
253 查看
Given a binary tree, flatten it to a linked list in-place.
For example,
Given
The flattened tree should look like:
思路一: 根据提供的线索可以观察到,每一个结点的右指针都指向它前序遍历的后一个结点。那么我们可以维持一个全局变量last结点,指向当前单链表的最后一个结点,按照前序遍历的次序不断更新last.right就可以得到需要的结果。
思路二: 观察可以发现,如果当前结点root有左子树,那么当前结点的right指针就指向当前结点的左子树结点,那么当前结点root的右子树往哪里放呢,那就放在它最后应该放在父节点的后面,在前序遍历中,右子树结点的前一个结点就是当前结点root的左子树中最右的一个结点,那么将root的右子树结点连接到root的左子树最右的一个结点即可。遍历的时候如果当前结点有左子树,都要先找到左子树中最右的结点,然后修改指针即可。
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
思路一: 根据提供的线索可以观察到,每一个结点的右指针都指向它前序遍历的后一个结点。那么我们可以维持一个全局变量last结点,指向当前单链表的最后一个结点,按照前序遍历的次序不断更新last.right就可以得到需要的结果。
public class Solution { public TreeNode last=null; public void flatten(TreeNode root) { if(root==null) return; last=root; TreeNode r=root.right; preOrder(root.left); preOrder(r); } public void preOrder(TreeNode root) { if(root==null) return; TreeNode r=root.right; last.right=root; last.left=null; last=root; preOrder(root.left); preOrder(r); } }
思路二: 观察可以发现,如果当前结点root有左子树,那么当前结点的right指针就指向当前结点的左子树结点,那么当前结点root的右子树往哪里放呢,那就放在它最后应该放在父节点的后面,在前序遍历中,右子树结点的前一个结点就是当前结点root的左子树中最右的一个结点,那么将root的右子树结点连接到root的左子树最右的一个结点即可。遍历的时候如果当前结点有左子树,都要先找到左子树中最右的结点,然后修改指针即可。
public class Solution { public void flatten(TreeNode root) { if(root==null) return; TreeNode rightMost=null; while(root!=null) { TreeNode tempR=root.right; if(root.left!=null) { rightMost=root.left; while(rightMost.right!=null) rightMost=rightMost.right; root.right=root.left; root.left=null; rightMost.right=tempR; } root=root.right; } } }
相关文章推荐
- 作弊揭发者
- 设计模式:单例模式的写法(基础写法和线程安全写法)
- css小记(rotate3d)
- rfkill的使用
- Android仿虾米音乐播放器之service
- CF-242-C bfs+stl
- IIS应用服务器下MP4无法播放的问题
- JDOM解析xml
- 微软澄清:真正的Win10通用Windows商店网页版还没有到来
- 电子竞技“小煤窑”蕴藏千亿?还是一场深V的边缘突围?
- Java NIO原理图文分析及代码实现
- android studio 项目 转换成eclipse
- SAP概念之Client(集团)
- iptables 详解
- 常用shell命令
- SQL集合
- odoo8.0+PyCharm4.5开发环境配置
- 暑假集训-字符串
- [MyBatis]mapperLocations属性通配符的使用
- java计算时间差的方法