题目描述
给定一个二叉树,原地将它展开为链表。
Sample Code (后序遍历)
class Solution {
private TreeNode node;
public void flatten(TreeNode root) {
if(root == null) return;
flatten(root.right);
flatten(root.left);
root.right = node;
root.left = null;
node = root;
}
}
Sample Code (递归)
一开始没想明白遇到root.left为null的情况,遇到root.left = null的情况时while(root.right != null)会自动弥补 root.left = null 的坑。
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;
}
}
Sample Code (非递归)
直接把左子树链接到右子树去,然后左子树里面的左子树到后面再以一样的道理处理。
class Solution {
public void flatten(TreeNode root) {
while(root != null) {
if(root.left == null) {
root = root.right;
}else {
TreeNode tmp = root.left;
while(tmp.right != null)
tmp = tmp.right;
tmp.right = root.right;
root.right = root.left;
root.left = null;
root = root.right;
}
}
}
}