题目描述:
给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
大体思路:
由上述结果可以看出,可以自然而然的想到通过改写二叉树的先序遍历解决该问题。
定义一递归函数step(TreeNode root) : TreeNode
输入当前结点,完成以当前结点作为有节点子树的展开,并且返回展开后最末尾的结点。
step()内部,只需要先完成左子树的展开,接着完成右子树的展开,再将左子树展开的链表接到头结点之后,将右子树展开的链表接到左子树展开的链表之后即可完成子树的展开。最后返回右子树的尾结点
不过对于step()的实现还需要考虑边界值,与左右子树不存在的情况。
具体实现代码如下:
/**
* 可以看出转换是以先序的顺序完成,因此可以通过改写二叉树的先序遍历
* 设计递归函数step(TreeNode root):+TreeNode
* 输入该数的头结点,完成转换,并且返回转换后的尾结点
* 因此只需要对于某一结点完成左子树转换,再完成右子树的转换,
* 最后将左子树拼接到头结点后面,右子树拼接到左子树后面 返回右子树的尾结点即可
* @param root 头结点
* @return 拼接后的尾结点
*/
public TreeNode step(TreeNode root) {
if (root == null) {
return null;
}
TreeNode last = root;
TreeNode left = root.left;
TreeNode right = root.right;
if(left != null) {
last.right = left;
last = step(left);
}
if(right != null) {
last.right = right;
last = step(right);
}
root.left = null;
return last;
}