【发布时间】:2017-11-28 03:07:44
【问题描述】:
这是我对problem 的解决方案,在给定二叉树的情况下,您需要找到所有非直接链接节点的总和。 “直连”是指父子关系,要明确一点。
我的解决方案 如果当前节点被访问,则不允许访问下一级节点。但是,如果当前节点未被访问,则您可能会也可能不会访问下一级的节点。
它通过了所有测试。然而,这个递归二叉树遍历的运行时间复杂度是多少。我认为是2^n,因为在每个节点上,你都有两个选择,是使用还是不使用,因此,下一个级别,每个选项都有两个选择,依此类推。
空间复杂度:不使用任何额外的存储空间,但由于这是递归实现,因此使用堆栈空间,堆栈中的最大元素可能是树的高度,即 n。所以O(n)?
public int rob(TreeNode root) {
return rob(root, false);
}
public int rob(TreeNode root, boolean previousStateUsed) {
if(root == null)
return 0;
if(root.left == null && root.right == null)
{
if(previousStateUsed == true)
return 0;
return root.val;
}
if(previousStateUsed == true)
{
int leftSumIfCurrentIsNotUsedNotUsed = rob(root.left, false);
int rightSumIfCurrentIsNotUsed = rob(root.right, false);
return leftSumIfCurrentIsNotUsedNotUsed + rightSumIfCurrentIsNotUsed;
}
else
{
int leftSumIfCurrentIsNotUsedNotUsed = rob(root.left, false);
int rightSumIfCurrentIsNotUsed = rob(root.right, false);
int leftSumIsCurrentIsUsed = rob(root.left, true);
int rightSumIfCurrentIsUsed = rob(root.right, true);
return Math.max(leftSumIfCurrentIsNotUsedNotUsed + rightSumIfCurrentIsNotUsed, leftSumIsCurrentIsUsed + rightSumIfCurrentIsUsed + root.val);
}
}
【问题讨论】:
标签: algorithm recursion time-complexity binary-tree big-o