【问题标题】:Verify that all nodes at given level have different values in binary tree验证给定级别的所有节点在二叉树中是否具有不同的值
【发布时间】:2018-07-25 10:30:24
【问题描述】:

我的问题是,这个问题是否可以在不使用任何数据结构(堆栈、列表等)的情况下解决,还是需要一个? (如果可能的话,我也想看看这两种情况下的解决方案)。


问题:

具有表示包含整数值的二叉树的 BinaryTree 类。假设已经实现了方法:

public BinaryTree right();  // returns right children
public BinaryTree left();   // returns left children
public int val();   // returns value of root node.

实现以下递归方法:

public static boolean allDifferentAtLevel(BinaryTree a, int lev){...}

接收整数的二叉树,并且仅当 a 的所有节点在级别 lev 的所有值都具有不同的值时才返回 true价值观。


提前感谢您的宝贵时间。

【问题讨论】:

  • 我可以使用额外的数据结构轻松解决这个问题。就像我可以为这个问题采取全球 DS 一样。你想要一个带有额外 DS 的解决方案吗?
  • 你也可以粘贴Node和BinaryTree类的类结构吗?

标签: java algorithm recursion binary-tree


【解决方案1】:

我们可以使用HashSet<Integer> 来跟踪levth 级别的数据。

public static boolean allDifferentAtLevel(BinaryTree a, int lev){
    return checker(new HashSet<Integer>(),a,0,lev); //EmptySet, Root, CurrentLevel, Level
}

public static boolean checker(HashSet<Integer> set,BinaryTree a, int currentLevel, int lev) {
    if(a==null) //If current node of tree is null, return true.
        return true;

    if(currentLevel==lev) //If currentLevel is the required level, We don't need to move further.
                          //We can just validate the data at currentLevel and return the appropriate value.
    {
        int value=a.val();
        if(set.contains(value)) //If set contains the value, Duplication found.
            return false;

        set.add(value);
        return true;
    }

    //Check for both of the children.
    return checker(set,a.left(),currentLevel+1,lev) && checker(set,a.right(),currentLevel+1,lev);
}

【讨论】:

    【解决方案2】:

    是的,这可以通过递归解决,无需额外的数据结构。

    让我们尝试为不同的levs 定义allDifferentAtLevel(BinaryTree tree, int lev) 方法的外观:

    对于lev=0,结果只是false,因为0 级别上的所有节点都具有相同的值。 0 级别只有一个节点,因此 所有 节点具有相同的值。

    对于lev=1,检查tree.right().val() == tree.left().val() 非常简单(添加null 检查)。

    对于更高级别 (lev&gt;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);
    

    有四个子树更深两层(lllrrlrr)。但是我们不能只检查这些子树,我们必须相互检查它们。这些子树有六对可能的不同对。为了检查这些子树,我们可以为每个不同的对(ll_lrll_rlll_rrlr_rllr_rrrl_rr)创建一个二叉树,然后检查这些二叉树中的每一个都是递归的。如果lllrrlrr 中的任何一个子树在lev-2 上具有相同的元素,那么它们中的一对在lev-1 上具有相同的元素。

    所以是的,这个问题可以通过递归来解决,而无需额外的数据结构。我不认为BinaryTree 是一个额外的数据结构。

    话虽如此,使用像集合这样的额外数据结构会使任务更容易。

    【讨论】:

      【解决方案3】:

      这是可能的,但它会效率低下 - 您可以实现两个递归函数:

      1. 执行 DFS 以达到所需级别的所有节点
      2. 从第一个函数(对于所需级别的每个节点)调用另一个函数,该函数将计算(也使用 DFS)所有节点的值等于第一个函数所考虑的节点的值,并检查此计数是否为等于 1。

      【讨论】:

        猜你喜欢
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-10
        • 2010-12-09
        • 1970-01-01
        相关资源
        最近更新 更多