Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java N元树深度和度算法_Java_Depth_N Ary Tree - Fatal编程技术网

Java N元树深度和度算法

Java N元树深度和度算法,java,depth,n-ary-tree,Java,Depth,N Ary Tree,我在一些算法中遇到了一些问题,这些算法应该返回树的最大度(节点的最大子节点数)和深度(最长分支的维数)。看起来有些树结构是有效的,有些树结构是无效的。有人能告诉我我的代码是否有问题吗 我的树结构是 public class Tree<T> { public Node<T> root; public Tree() { root = null; } 这将返回5,但应返回6 public void Test_Depth(){ tree.insert

我在一些算法中遇到了一些问题,这些算法应该返回树的最大度(节点的最大子节点数)和深度(最长分支的维数)。看起来有些树结构是有效的,有些树结构是无效的。有人能告诉我我的代码是否有问题吗

我的树结构是

public class Tree<T> {

  public Node<T> root;

  public Tree() {
    root = null;
  }
这将返回5,但应返回6

public void Test_Depth(){
  tree.insert(null, e1);
  tree.insert(e1, e2);
  tree.insert(e1, e3);
  tree.insert(e3, e4);
  tree.insert(e3, e5);
  tree.insert(e3, e6);
  assertEquals(3,tree.degree());
}
这应该返回3,但返回2

e1到e7是整数。

两件事

首先,您的
searchAux
功能是错误的。以下行无效,因为其返回值被忽略:

searchAux(node.getSibling(), key);
此外,
while
循环允许将子节点分配给错误的父节点。状况

node.getChild() != null && key != node.getElem()
如果您正在访问的节点没有子节点,则无论其键值如何,都为false;这意味着随后的
返回节点指令

例如,在第二个例子中,就是这样。这是前三次插入后的情况(垂直线=父子,水平线=兄弟):

到目前为止还不错。当您调用
tree.insert(e3,e4)
时,e3被访问但被忽略;e2返回,取而代之(试着遍历代码)。因此:

顺便说一句,这就是第二棵树最后的样子:

e1
|
e2--e3
|
e4
|
e5
|
e6
第二:据我所知,第一棵树是正确的,即使你的搜索算法是错误的。其深度为5,而不是6(根节点的深度为零):

话虽如此,下面是递归深度优先搜索的快速草稿:

private Node<T> searchAux(Node<T> node, T key){
    if(node == null) 
        return null;
    if (node.getElem() == key)
        return node;
    if (node.getChild() != null) {
        Node<T> foundNode = searchAux(node.getChild(), key);
        if (foundNode != null)
            return foundNode;
    } 
    return searchAux(node.getSibling(), key);
}
专用节点搜索辅助(节点节点,T键){
if(node==null)
返回null;
if(node.getElem()==键)
返回节点;
if(node.getChild()!=null){
Node foundNode=searchAux(Node.getChild(),key);
if(foundNode!=null)
返回foundNode;
} 
返回searchAux(node.getSibling(),key);
}

(顺便说一句,在
return
s之后不需要
else
s)。

我认为提供“坏”和“好”树结构将有助于分析问题。我添加了它们。很抱歉没有这样做。问题是,他们几乎可以处理我尝试过的任何东西,除了那两个和更多的东西。你能给我们展示一下你的插入(…)实现吗?完成了。Insert方法使用搜索辅助方法。如果您需要任何澄清,请告诉我
e1
e7
?好的。现在Insert应该可以工作了。我用各种各样的树来验证。尽管如此,深度和程度方法仍然不起作用。乍一看,
auxDepth
方法从未访问过兄弟姐妹。试着解决这个问题。我用了一段时间来访问所有的兄弟姐妹,改变了这两种方法,效果很好。非常感谢你的帮助!
public void Test_Depth(){
  tree.insert(null, e1);
  tree.insert(e1, e2);
  tree.insert(e1, e3);
  tree.insert(e3, e4);
  tree.insert(e3, e5);
  tree.insert(e3, e6);
  assertEquals(3,tree.degree());
}
searchAux(node.getSibling(), key);
node.getChild() != null && key != node.getElem()
e1
|
e2--e3
e1
|
e2--e3
|
e4
e1
|
e2--e3
|
e4
|
e5
|
e6
0: e2
   |
1: e3--e1
   |
2: e4
   |
3: e5
   |
4: e6
   |
5: e7
private Node<T> searchAux(Node<T> node, T key){
    if(node == null) 
        return null;
    if (node.getElem() == key)
        return node;
    if (node.getChild() != null) {
        Node<T> foundNode = searchAux(node.getChild(), key);
        if (foundNode != null)
            return foundNode;
    } 
    return searchAux(node.getSibling(), key);
}