Given a binary tree, flatten it to a linked list in-place.
For example, given the following tree:
1
/
2 5
/ \
3 4 6
The flattened tree should look like:
1
2
3
4
5
6
知识点
stack 先进先出
pop 排除stack顶 并取直
peek 取stack顶的值
push 添加值至stack顶
思路一
利用一个stack
先存入根节点
然后如果stack不为空
排除stack最顶层并设置为curnode
先添加右节点,再添加左节点(先进后出)
如果左右节点不为空,cur节点的右节点取stack最顶层(root的左节点)
然后把curnode 的左节点设为空
循环至stack为空
这个算法不复杂但是自己想不出来看了nick的视频学习了
但是这并不是最优解
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public void flatten(TreeNode root) {
方法一
if(root == null){
return;
}
Stack<TreeNode> stack = new Stack();
stack.push(root);
while(!stack.isEmpty()){
TreeNode cur = stack.pop();
if(cur.right != null){
stack.push(cur.right);
}
if(cur.left != null){
stack.push(cur.left);
}
if(!stack.isEmpty()){
cur.right = stack.peek();
}
cur.left = null;
}
}
}```
思路二
经过第一个解之后发现并不是最优解
于是开始寻找最优解
于是便有了如下解法
但是并不是很理解
[原文地址](https://angledark0123.pixnet.net/blog/post/66638817-leetcode-tree,linkedlist-114-%EF%BC%A0-java)
文章中讲到
做法是top down,因为树的走法是类似于前序遍历 preorder trversal,所以顺序是 root ——leftsubtree—— rightsubtree
所以要建list以 reverse preorder traversal 的方法,从 right subtree 先做 然后接上 leftsubtree 再接root
做法需要确定两点
1right subtree 能接上 leftsubtree
2 leftsubtree 能接上 root
跟着走一遍能想通 但是真的不好想这个做法 很巧妙
class Solution {
TreeNode prev = null;
public void flatten(TreeNode root) {
//方法2 运用前序遍历
if(root == null) return;
flatten(root.right);
flatten(root.left);
root.right = prev;
root.left = null;
prev = root;
}
}```