二叉树展开为链表
题目描述
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/
2 5
/ \
3 4 6
将其展开为:
1
2
3
4
5
6
思路分析
由题意得,展开后从根节点至叶节点为先序遍历。因此通过先序遍历并保存序列节点,再展开。代码如下:
public void flatten(TreeNode root) {
if (root==null)return;
Stack<TreeNode> stack = new Stack<>();
ArrayList<TreeNode> nodes = new ArrayList<>();
while (!stack.isEmpty()||root!=null){
while (root!=null){
stack.push(root);
nodes.add(root);
root=root.left;
}
if (!stack.isEmpty()){
TreeNode pop = stack.pop();
root=pop.right;
}
}
for (int i = 0; i < nodes.size(); i++) {
nodes.get(i).left=null;
if (i==nodes.size()-1){
nodes.get(i).right=null;
break;
}
nodes.get(i).right=nodes.get(i+1);
}
}