【问题标题】:Print all the nodes in a binary tree which do not have sibling?打印二叉树中没有兄弟节点的所有节点?
【发布时间】:2017-03-29 15:18:27
【问题描述】:

兄弟节点是具有相同父节点的节点。在二叉树中,最多可以有一个兄弟姐妹。不应该打印根,因为根不能有兄弟。

我为此编写了代码,该代码在我迄今为止使用的所有测试用例中都可以正常工作,但是当我尝试在在线判断中提交它时,大多数情况下都出错了。尽管我已尽力弄清楚它是什么,但我无法弄清楚可能是什么错误。我也无法为特定的测试用例试运行,因为我无权访问它们。

public static void printNodesWithoutSibling(BinaryTreeNode<Integer> root) {

        if(root==null)
        return;


        printNodesWithoutSibling(root.left); 
        printNodesWithoutSibling(root.right);

        if(root.right==null && root.left!=null)
        {
            System.out.print(root.left.data+" ");
            return;
        }



        else if(root.left==null && root.right!=null)
        {

            System.out.print(root.right.data+" ");
            return;
        }
}

【问题讨论】:

  • 听起来对你的教授或助教来说是个好问题
  • 是否至少有一个样本预期输出?代码总是添加一个空格。即使对于最后一个节点,这是否可以接受?
  • 是的 4 个给定的测试用例运行良好,但其他 5 个不能
  • 这可能取决于预期的遍历。您的代码对每个节点执行的操作是在左侧子树中打印“没有兄弟姐妹的节点”,然后在右侧子树中打印,最后打印当前节点的其中一个子节点(如果它没有兄弟节点)。也许预期的结果会在遍历中遇到“没有兄弟姐妹的节点”时立即打印出来。您是否尝试过将 if/else 放在 两个递归调用之前?
  • @Onheiron 是的,我已经试过了

标签: java data-structures binary-tree


【解决方案1】:

您的代码没有考虑左孩子没有右兄弟姐妹的情况。

确定节点是否有兄弟节点所需的知识在其父节点中。

以下代码 sn-p 按顺序打印没有兄弟节点的节点。您可以轻松地修改它,如果您需要它是 inorder 或 postorder。代码是用c++编写的,但我认为用java重构不会有任何问题

void print_nodes_without_sibling(Node * root, bool no_sibling = false)
{
  if (root == nullptr)
    return;

  if (no_sibling)
    cout << root->key << endl;

  print_nodes_without_sibling(root->left,
                              root->left != nullptr and root->right != nullptr);
  print_nodes_without_sibling(root->right,
                              root->left != nullptr and root->right != nullptr);
}

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2021-02-07
    • 2016-01-22
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多