题解:给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
将其展开为:
题解(一):先用递归的方法先序遍历二叉树,设置一个链表保存每一个二叉树结点,然后再按照此链表保存的二叉树结点重构二叉树
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public void flatten(TreeNode root) {
LinkedList<TreeNode>list=new LinkedList<>();
move(list,root);
int size=list.size();
TreeNode temp=root;
for(int i=1;i<size;i++){
temp.left=null;
temp.right=list.get(i);
temp=temp.right;
}
}
private void move(List<TreeNode>linkedList,TreeNode root){
if(root!=null){
linkedList.add(root);
move(linkedList,root.left);
move(linkedList,root.right);
}
}
}
题解(二):遍历二叉树的方法不一定是递归,二叉树的遍历本质上来说是DFS算法,我们还可以利用栈实现二叉树的遍历
class Solution {
public void flatten(TreeNode root) {
LinkedList<TreeNode>list=new LinkedList<>();
Stack<TreeNode>stack=new Stack<>();
TreeNode next=root;
while(!stack.empty()||next!=null){
while(next!=null){
stack.push(next);
list.add(next);
next=next.left;
}
next=stack.pop().right;
}
int size=list.size();
TreeNode temp=root;
for(int i=1;i<size;i++){
temp.left=null;
temp.right=list.get(i);
temp=temp.right;
}
}
}