114 二叉树展开为链表
题目
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
代码(前序遍历)
/**
* Definition for a binary tree node.
* public 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) {
List<TreeNode> list = new ArrayList<TreeNode>();
preOrder(root,list);
int size = list.size();
for(int i = 1;i < size;i++){
TreeNode prev = list.get(i-1);
TreeNode cur = list.get(i);
prev.left = null;
prev.right = cur;
}
}
public void preOrder(TreeNode root, List<TreeNode> list){
if (root!=null){
list.add(root);
preOrder(root.left,list);
preOrder(root.right,list);
}
}
}
总结
- 题目中二叉树的展开顺序实质上为二叉树的前序遍历,理由list将二叉树的前序遍历的结果储存起来;
- list中第一个元素为root,可以使用list.get(0)得到;
- 使用for循环对于存储的节点重新树化。