Java 打印二叉树中没有兄弟节点的所有节点?
同级节点是具有相同父节点的节点。在二叉树中,最多可以有一个兄弟。不应打印Root,因为Root不能有同级 我已经为此编写了代码,它在我迄今为止使用的所有测试用例中都运行良好,但当我试图在online judge中提交它时,大多数用例都出现了错误。虽然我已经尽了最大的努力去找出它是什么,但我还是无法找出它可能是什么。我也不能为那个特定的测试用例进行试运行,因为我没有访问它们的权限Java 打印二叉树中没有兄弟节点的所有节点?,java,data-structures,binary-tree,Java,Data Structures,Binary Tree,同级节点是具有相同父节点的节点。在二叉树中,最多可以有一个兄弟。不应打印Root,因为Root不能有同级 我已经为此编写了代码,它在我迄今为止使用的所有测试用例中都运行良好,但当我试图在online judge中提交它时,大多数用例都出现了错误。虽然我已经尽了最大的努力去找出它是什么,但我还是无法找出它可能是什么。我也不能为那个特定的测试用例进行试运行,因为我没有访问它们的权限 public static void printNodesWithoutSibling(BinaryTreeNode&
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;
}
}
publicstaticvoidprintNodeswithoutsibling(二进制树节点根){
if(root==null)
返回;
打印不带边框的节点(root.left);
打印不带边框的节点(root.right);
if(root.right==null&&root.left!=null)
{
System.out.print(root.left.data+“”);
返回;
}
else if(root.left==null&&root.right!=null)
{
System.out.print(root.right.data+“”);
返回;
}
}
您的代码没有考虑到没有右同胞的左子女的情况
确定节点是否有同级节点所需的知识位于其父节点中
下面的代码片段按预排序打印没有同级的节点。你可以很容易地修改它,如果你需要它的顺序或后序。代码是用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);
}
void打印没有兄弟节点的节点(节点*根,布尔无兄弟节点=false)
{
if(root==nullptr)
返回;
如果(没有兄弟姐妹)
不能按左键,
根->左!=nullptr和根->右!=nullptr);
打印没有兄弟节点的节点(根->右),
根->左!=nullptr和根->右!=nullptr);
}
您的代码没有考虑到没有右同胞的左子女的情况
确定节点是否有同级节点所需的知识位于其父节点中
下面的代码片段按预排序打印没有同级的节点。你可以很容易地修改它,如果你需要它的顺序或后序。代码是用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);
}
void打印没有兄弟节点的节点(节点*根,布尔无兄弟节点=false)
{
if(root==nullptr)
返回;
如果(没有兄弟姐妹)
不能按左键,
根->左!=nullptr和根->右!=nullptr);
打印没有兄弟节点的节点(根->右),
根->左!=nullptr和根->右!=nullptr);
}
对于您的教授或TAI来说,这听起来是个不错的问题。是否至少有一个样本预期输出?代码总是添加一个空格。即使对于最后一个节点,这也是可以接受的吗?是的,给定的测试用例中有4个运行良好,但其他5个则不能,这可能取决于预期的遍历。您的代码对每个节点所做的是打印左子树中的“没有兄弟节点的节点”,然后打印右子树中的节点,如果当前节点没有兄弟节点,则最终打印当前节点的一个子节点。可能预期的结果是在遍历过程中遇到“没有兄弟节点的节点”时立即打印出来。你试过把if/else放在两个递归调用之前吗?@Onheiron是的,我已经试过了,我也试过了,先往右走,然后往左走,但我得到了同样的结果。对你的教授或TAI来说,这是一个很好的问题。至少有一个样本预期输出吗?代码总是添加一个空格。即使对于最后一个节点,这也是可以接受的吗?是的,给定的测试用例中有4个运行良好,但其他5个则不能,这可能取决于预期的遍历。您的代码对每个节点所做的是打印左子树中的“没有兄弟节点的节点”,然后打印右子树中的节点,如果当前节点没有兄弟节点,则最终打印当前节点的一个子节点。可能预期的结果是在遍历过程中遇到“没有兄弟节点的节点”时立即打印出来。你试过把if/else放在两个递归调用之前吗?@Onheiron是的,我已经试过了,我也试过先向右,然后向左,但我得到了相同的结果