完成前退出二进制预订遍历

时间:2015-03-24 19:59:29

标签: java binary-tree preorder

我有一个由各种节点组成的二叉树。我想使用预订递归遍历树,找到具有匹配描述(desc)的节点并返回它(如果存在)。然而,遍历继续完成。我正在制造逻辑错误,或者遍历算法不合适?

这是预订遍历回归功能,我在下面称之为:

public Node replaceNodes(Node currentNode, int itemId, String desc) {

if (currentNode == null) {
    System.out.println("null");
}

if (currentNode != null) {
    //System.out.println(desc + " " + currentNode.getDesc());
    if (currentNode.getDesc().matches(desc) 
            && currentNode.getKey() != itemId) {
        System.out.println("returned");
        return currentNode;
        //System.out.println(currentNode.getDesc());
    } else {
        replaceNodes(currentNode.leftChild, itemId, desc);
        replaceNodes(currentNode.rightChild, itemId, desc);
        //System.out.println("replace");
    }
} 

return null;
}


  Node replaceItem = r1Items.replaceNodes(r1Items.
                            getRoot(), searchId, searchNode.getDesc());
                    //check suitable item found

感谢。如果需要,我很乐意进一步澄清。

1 个答案:

答案 0 :(得分:0)

您以递归方式调用方法,但不存储递归调用返回的值。目前,只有当您要查找的节点是根节点时,才能获得正确的结果。

我认为你在else语句中需要以下内容。

. . . 
} else {
   Node left = replaceNodes(currentNode.leftChild, itemId, desc);
   if(left != null) { return left; }
   Node right = replaceNodes(currentNode.rightChild, itemId, desc);
   if(right != null) { return right; }
}
. . . 

以下是一点点简化

. . . 
} else {
   Node left = replaceNodes(currentNode.leftChild, itemId, desc);
   if(left != null) { return left; }
   return replaceNodes(currentNode.rightChild, itemId, desc);
}
. . .