思路:通过观察可以发现,所谓展开就是按照前序遍历将二叉树重新连接,使用递归。
首先记录root的右子树;
对root的左子树递归展开,并返回根节点,连接到root的右边;
对root的右子树递归展开,连接到当前链表的末尾。
public void flatten(TreeNode root) {
flattenCore(root);
}
public TreeNode flattenCore(TreeNode root){
if(root==null||(root.left==null&&root.right==null)) return root;
//记录右子树
TreeNode rootRight=root.right;
//左子树展开,连接到root的右边
root.right=flattenCore(root.left);
root.left=null;
//找到当前链表的末尾
TreeNode node=root;
while(node.right!=null) node=node.right;
//右子树展开,连接到当前链表末尾的右侧
node.right=flattenCore(rootRight);
return root;
}