114. 二叉树展开为链表
给 flatten
函数输入一个节点 root
,那么以 root
为根的二叉树就会被拉平为一条链表。
我们再梳理一下,如何按题目要求把一棵树拉平成一条链表?很简单,以下流程:
1、将 root
的左子树和右子树拉平。
2、将 root
的右子树接到左子树下方,然后将整个左子树作为右子树。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmlEfDpj-1609146257230)(https://i.loli.net/2020/12/28/ym7UcZIiXOg8feR.png)]
package 二叉树;
public class 二叉树展开为链表 {
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;
}
}
public static void main(String[] args) {
}
// 定义:将以 root 为根的树拉平为链表
public static void flatten(TreeNode root) {
// base case
if(root==null)
return;
flatten(root.left);
flatten(root.right);
/**** 后序遍历位置 ****/
// 1、左右子树已经被拉平成一条链表
TreeNode left = root.left;
TreeNode right = root.right;
// 2、将左子树作为右子树
root.right=left;
root.left=null;
// 2、将左子树作为右子树
TreeNode p=root;
while (p.right!=null){
p=p.right;
}
p.right=right;
}
}