这道题可以发现左子树的最后。连着右子树的开头,所以就设计了一个找到最末点的函数,而dfs的任务是先递归合并左子树,再来合并右子树
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void flatten(TreeNode root) {
if(root==null)return;
dfs(root);
revese(root);
}
private void dfs(TreeNode node){
//按顺序,先把左子树搞完,在搞右子树
if (node.left!=null){dfs(node.left);lastnode(node).left = node.right;}
if (node.right!=null){dfs(node.right);}
if (node.left==null&&node.right==null)return;
}
private TreeNode lastnode(TreeNode node){
//System.out.println(1);
if (node==null)return node;
if (node.left!=null){return lastnode(node.left);}//只要有左子节点,就往左走
else if (node.left==null&&node.right!=null){return lastnode(node.right);}//没左子树了,但有右子树,往右走。
else if (node.left==null&&node.right==null)return node;
return null;
}
private void revese(TreeNode node){//到时候会形成一条左边的链,和结果右链刚好相反
if (node==null)return;
if(node.left!=null){
node.right = node.left;
node.left=null;
}
revese(node.right);
}
}