一、题目
给定一个二叉树,原地将它展开为一个单链表。
二、思路
先说一个较为麻烦、耗费空间的解法:
- 由题目可知,其将二叉树转换为单链表的顺序即二叉树的先序遍历
- 将先序遍历的节点放在动态数组中
- 在将动态数组转化为链表
这样的解法容易想,但用了额外的动态数组空间,不符合题目原地的本意。
于是,采用另一种思路,递归的方式:
递归出口:节点为空
递归过程:
- 节点左子树展开成链表
- 节点右子树展开成链表
- 将节点的左子树,移到节点右子树的位置
- 将节点的右子树,移到新右子树的位置
如下图所示
代码如下:
/**
* 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;
}
flatten(root.left);
flatten(root.right);
TreeNode temp = root.right;
root.right = root.left;
root.left =null;
while(root.right != null){
root = root.right;
}
root.right = temp;
}
}