0. 题目
二叉树展开为链表
给定一个二叉树,原地将它展开为一个单链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
1. 常规解题
1.1 分析
主要思路:
- 先前序遍历二叉树,结果放置在数组内;前序遍历读取顺序:根节点-左节点-右节点;最终存储的结构:[1,2,3,4,5,6]
- 数组从前往后取出元素,构造左子树为null的二叉树;
1.2 代码
public void flatten(TreeNode root) {
if (root == null) return ;
LinkedList<TreeNode> res = new LinkedList<TreeNode>();
dfs(root, res);
TreeNode head = res.removeFirst();
head.left = null;
while (res.size() > 0) {
TreeNode temp = res.removeFirst();
temp.left =null;
head.right = temp;
head = head.right;
}
}
// 二叉树的前序遍历
void dfs(TreeNode root, List<TreeNode> res) {
if (root == null) return;
res.add(root);
dfs(root.left, res);
dfs(root.right, res);
}
2. 高阶解题
2.1 分析
主要思路:暂无
2.2 代码
TreeNode pre = null;
public void flatten2(TreeNode root) {
if (root == null) return;
flatten2(root.right);
flatten2(root.left);
root.left = null;
root.right = pre;
pre = root;
}