题目
题目分析
二叉树的题目基本都是通过递归的方式去做,递归最最重要的就是定义好递归函数的语义。
这里我们定义一个辅助函数。这个函数能够将以node
为根的二叉树拉成一个链表,并返回头节点。充分利用这个函数的语义(不管这个函数具体如果实现),我们把以root为根的二叉树拉成一个链表可以分为以下几个步骤:
(1)将root
树的左子树拉成一个链表,即 TreeNode left = flattenHelp(root.left)
(2)将root
树的右子树拉成一个链表,即 TreeNode rigth = flattenHelp(root.right)
(3)将left
赋值给root.right
,将root.lef
t置null
(4)将right
接到left
的后面
private TreeNode flattenHelp(TreeNode node){
}
代码实现
public class Solution01 {
public void flatten(TreeNode root) {
if (root == null) {
return;
}
flattenHelp(root);
}
// 将以Node为根节点的树,拉直为链表,返回根节点
private TreeNode flattenHelp(TreeNode node) {
if (node == null) {
return null;
}
TreeNode left = flattenHelp(node.left); // 第一步
TreeNode right = flattenHelp(node.right); // 第二步
node.right = left; // 第三步
node.left = null;
TreeNode curNode = node;
while (curNode.right != null) { // 第四步
curNode = curNode.right;
}
curNode.right = right;
return node;
}
private class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
}