装饰树
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 204 ms, 内存: 38.5 MB
/*
* 题目思路:
* 使用Java Stream API,我们可以创建一种更为函数式的方式来处理这个问题。
* 通过Stream,我们可以使用递归来处理树的每个节点。
* 对于每一个节点,如果它有左子节点,则在它和左子节点之间插入一个值为-1的节点;
* 如果它有右子节点,则在它和右子节点之间插入一个值为-1的节点。
*/
import java.util.function.Function;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode addDecorations(TreeNode root) {
if (root == null) return null;
Function<TreeNode, TreeNode> decorate = (TreeNode node) -> {
if (node == null) return null;
if (node.left != null) {
TreeNode left = node.left;
node.left = new TreeNode(-1);
node.left.left = decorate.apply(left);
}
if (node.right != null) {
TreeNode right = node.right;
node.right = new TreeNode(-1);
node.right.right = decorate.apply(right);
}
return node;
};
return decorate.apply(root);
}
}
解释
方法:
此题的核心思路是在原二叉树的每个节点与其子节点之间插入一个值为-1的新节点。递归方法是用来遍历每个节点,并在遍历过程中插入新节点。如果当前节点有左子节点,则在当前节点的左子节点前插入一个值为-1的新节点,并将原左子节点变为新插入节点的左子节点。同样的处理适用于右子节点。递归继续对新插入的(值为-1的)节点的左或右子节点(视原始子节点位置而定)调用同样的过程,直到所有的子节点都被处理完毕。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在这个递归函数中,对于叶子节点直接返回而不插入-1节点是基于什么考虑?
▷🦆
插入-1节点后,为什么选择继续递归调用`expandBinaryTree`函数处理新插入的-1节点的子节点,而不是原始的子节点?
▷🦆
如果根节点为空,函数直接返回None。这种处理方式是否适用于所有二叉树相关的问题,还是特定于本题的要求?
▷