二叉树剪枝
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 22 ms, 内存: 16.0 MB
/*
* 思路:使用递归方法遍历二叉树,从叶子节点开始检查并删除值为0的节点。
* 如果一个节点的所有子树均为0,那么删除该节点。
* 注意:Java Stream不适用于这种操作,递归更为直接和合适。
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode pruneTree(TreeNode root) {
if (root == null) return null;
root.left = pruneTree(root.left);
root.right = pruneTree(root.right);
if (root.val == 0 && root.left == null && root.right == null) {
return null;
}
return root;
}
}
解释
方法:
本题解采用递归方法来解决问题。递归函数 `pruneTree` 检查每个节点,如果一个节点的值为 0 并且它的左右子树也都被剪枝后不存在任何节点(即左右子节点都返回了 None),那么这个节点也应该被剪掉(返回 None)。递归首先处理左右子树,然后处理当前节点,这样可以保证从底部开始剪枝,只有当一个节点的所有子树都不包含值为 1 的节点时,这个节点才会被剪掉。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在递归函数中,如果一个节点的左右子树已被剪枝,节点本身值为0时才会返回None,这种处理方式是否会遗漏一些应被剪枝的情况?
▷🦆
递归剪枝的顺序为先左后右,最后是当前节点。这种顺序对最终的剪枝结果有影响吗?如果先处理当前节点再递归子树会怎样?
▷🦆
递归处理时,是否有可能因为过深的递归层次导致栈溢出?这种情况下有没有非递归的替代方案?
▷