Given a binary tree, flatten it to a linked list in-place.
For example,
Given
1 / \ 2 5 / \ \ 3 4 6
The flattened tree should look like:
1 \ 2 \ 3 \ 4 \ 5 \ 6
Hints:
If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.
Subscribe to see which companies asked this question.
先给出我的冗长代码。。
/**
* 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)
helper(root);
return;
}
private TreeNode helper(TreeNode root) {
if (root.left == null && root.right == null)
return root;
else if (root.left == null)
return helper(root.right);
else if (root.right == null) {
root.right = root.left;
root.left = null;
return helper(root.right);
} else {
TreeNode left = root.left;
TreeNode right = root.right;
root.left = null;
root.right = left;
TreeNode temp = helper(left);
temp.left = null;
temp.right = right;
return helper(right);
}
}
}
基本想法是用递归,前序遍历
分为4种情况:
1.如果节点是树叶,则返回这个节点,作为右子树的父亲。
2.如果节点的左子树为空,右子树不为空,则不做任何更改,用右子树作下一次的递归。
3.如果节点的左子树不为空,右子树为空,则把左子树加在右子树上,左子树设为 null,用更改后的右子树作下一次递归。
4.若左右子树都不为空,设置两个变量 left 和 right 存储左右子树,左子树设置为 null,右子树设置为 left ,然后用 left 作下一次的递归,递归返回结果的左子树设置为null,右子树设置为right,最后再用 right 作下一次的递归。