题目描述
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将二叉树变为链表结构。
解题思路
将二叉树分为三部分考虑,root,leftTree,rightTree,按如下步骤进行递归:
- 将右子树flatten,并得到其最末尾的节点;
- 将左子树flatten,并得到其最末尾的节点;
- 将左子树的尾节点的右指针指向右子树的根节点;
- root的右指针指向左子树的根节点;
代码
/**
* 将二叉树变为链表结构
* @param root
*/
public static void flatten(TreeNode root) {
getFlattenTree(root);
}
/**
* 将二叉树变为链表结构,并返回其尾节点
* @param root
* @return
*/
public static TreeNode getFlattenTree(TreeNode root) {
if(root==null)
return null;
if (root.left == null && root.right == null)
return root;
TreeNode leftTailNode = null;
TreeNode rightTailNode = null;
//如果右子树不为空,得到右子树flatten后的最末节点
if (root.right != null) {
rightTailNode = getFlattenTree(root.right);
}
if (root.left != null) {
//如果右子树不为空,得到左子树flatten后的最末节点
leftTailNode = getFlattenTree(root.left);
if(root.right == null){
//如果右子树为空,则最后返回的是左子树flatten后的最末节点
rightTailNode = leftTailNode;
}
//将左子树插入到右子树之前
leftTailNode.right = root.right;
leftTailNode.left = null;
root.right = root.left;
//左子树赋为空
root.left = null;
}
//返回flatten后的尾节点
return rightTailNode;
}