题目描述:
给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 :
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
解题思路:
写递归算法的秘诀:写树相关的算法,简单说就是,先搞清楚当前root
节点该做什么,然后根据函数定义递归调用子节点,递归调用会让孩子节点做相同的事情。
我们尝试给出这个函数的定义:
给flatten
函数输入一个节点root
,那么以root
为根的二叉树就会被拉平为一条链表。
操作思路有三步:
1.事先记录左右子树节点
2.将左子树作为右子树
3.将原先的右子树接到当前右子树的末端
package com.lzhsite.leetcode.algoritom.practise.tree;
import com.lzhsite.leetcode.algoritom.dataStruct.tree.BinTreeNode;
public class LeetCode114把二叉树展开为链表 {
// 定义:将以 root 为根的树拉平为链表
void flatten(BinTreeNode root) {
// base case
if (root == null) return;
flatten(root.getLChild());
flatten(root.getRChild());
/**** 后序遍历位置 ****/
// 1、左右子树已经被拉平成一条链表
BinTreeNode left = root.getRChild();
BinTreeNode right = root.getRChild();
// 2、将左子树作为右子树
root.setLChild(null);
root.setRChild(left);
// 3、将原先的右子树接到当前右子树的末端
BinTreeNode p = root;
while (p.getRChild() != null) {
p.setRChild(p.getRChild());
}
p.setRChild(right);
}
}