是的,这可以通过递归解决,无需额外的数据结构。
让我们尝试为不同的levs 定义allDifferentAtLevel(BinaryTree tree, int lev) 方法的外观:
对于lev=0,结果只是false,因为0 级别上的所有节点都具有相同的值。 0 级别只有一个节点,因此 所有 节点具有相同的值。
对于lev=1,检查tree.right().val() == tree.left().val() 非常简单(添加null 检查)。
对于更高级别 (lev>1),您应该递归调用该方法。基本上,allDifferentAtLevel(tree.left(), lev - 1) 和allDifferentAtLevel(tree.right(), lev - 1) 将确保左子树和右子树满足条件。不幸的是,这还不够,因为左右子树之间可能有一些共同的价值。
但是可以绕过这种检查,不仅是左右检查,还有更深两层的子树的所有组合。比如:
BinaryTree ll = tree.left() == null ? null : tree.left().left();
BinaryTree lr = tree.left() == null ? null : tree.left().right();
BinaryTree rl = tree.right() == null ? null : tree.right().left();
BinaryTree rr = tree.right() == null ? null : tree.right().right();
BinaryTree ll_lr = tree.left();
BinaryTree ll_rl = new BinaryTree(0, ll, rl);
BinaryTree ll_rr = new BinaryTree(0, ll, rr);
BinaryTree lr_rl = new BinaryTree(0, lr, rl);
BinaryTree lr_rr = new BinaryTree(0, lr, rr);
BinaryTree rl_rr = tree.right();
return allDifferentAtLevel(ll_lr, lev - 1) &&
allDifferentAtLevel(ll_rl, lev - 1) &&
allDifferentAtLevel(ll_rr, lev - 1) &&
allDifferentAtLevel(lr_rl, lev - 1) &&
allDifferentAtLevel(lr_rr, lev - 1) &&
allDifferentAtLevel(rl_rr, lev - 1);
有四个子树更深两层(ll、lr、rl、rr)。但是我们不能只检查这些子树,我们必须相互检查它们。这些子树有六对可能的不同对。为了检查这些子树,我们可以为每个不同的对(ll_lr、ll_rl、ll_rr、lr_rl、lr_rr、rl_rr)创建一个二叉树,然后检查这些二叉树中的每一个都是递归的。如果ll、lr、rl、rr 中的任何一个子树在lev-2 上具有相同的元素,那么它们中的一对在lev-1 上具有相同的元素。
所以是的,这个问题可以通过递归来解决,而无需额外的数据结构。我不认为BinaryTree 是一个额外的数据结构。
话虽如此,使用像集合这样的额外数据结构会使任务更容易。