文章目录
- 题目描述
- 解法 & 思路
- 思路一
- 思路二
题目描述
我佛了,这道题挺描述不明的,有坑,过不了oj建议马上看评论 or 题解
解法 & 思路
思路一
- 代码就不贴了,过不去
- 先序遍历,按序存储val到一个ArrayList。然后用这个ArrayList来构造单链表即可(注意left置空)
思路二
- 递归:把左子树、右子树弄成单链表,存储。然后left = null,再把左子树接到right,然后把右子树接到当前最右边的right。
/*** 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) {if(root == null){return;}// 先保存左右子树TreeNode left = root.left;TreeNode right = root.right;// 都弄直了再连上flatten(left);flatten(right);// 左子树置空root.left = null;root.right = left;// 取到最右边while(root.right != null){root = root.right;}root.right = right;}
}
- 无注释:自底向上,注意结点关系处理的先后关系
class Solution {public void flatten(TreeNode root) {if(root == null) {return;}TreeNode left = root.left;TreeNode right = root.right;flatten(root.left);flatten(root.right);root.left = null;root.right = left;while(root.right != null) {root = root.right;}root.right = right;}
}