搜索未排序树的特定节点

时间:2015-04-10 20:41:29

标签: java recursion tree backtracking

一般的想法是使用递归回溯(BinaryNode,数据为Character)遍历树,以查找特定的char。该方法将输出从root到其数据为指定char的节点的路径。向左移动意味着路径将具有0,向右移动意味着路径将具有1.因此,例如,到最上面的根节点的路径是空字符串,到左子节点的路径是0(并且1表示合适的孩子)。

到目前为止,我有一个递归的void方法,其基本情况是找到匹配,并且方法结束。否则,如果有一个左子,我再次调用该方法,然后检查和/或呼叫正确的孩子。最后一部分是当前根是一个叶子节点,在那里我会修改存储的路径以消除最近添加的0或1,然后返回到先前的递归调用。这是我到目前为止所拥有的

//method head
if(c==root.getData()) return;

if(root.hasLeftChild()) //call method with left child as root, and a 0 added to path

//same for right child, only add a 1 instead of a 0

//if leaf node aka neither left or right child, path will now be a substring from 0 to path.length()-1

我感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

注意:由于没有提供BinaryNode的实现,我只是使用它应该提供的一些基本方法。

public String getPath(char c , BinaryNode<Character> node){
     if(node.getData() == c)//matching node found
          return "";

     if(node.right() != null){//check if right child is parent of match
          String tmp = getPath(c , node);
          if(tmp != null)//match found -> complete path from this node
               return "1" + tmp;
     }
     if(node.left() != null){//check if left child is parent of match
          String tmp = getPath(c , node);
          if(tmp != null)
               return "0" + tmp;
     }

     //c is no content of the tree with node as root -> return null
     return null;
}

此代码全部集于一身。当它深入到树中时,它会搜索匹配节点,当算法返回到树的根时,路径会向后生成(结果的顺序正确)。

答案 1 :(得分:0)

recurAndFind(String str, Node x, char c){
if(x== null);
if(x.getChar() == c)
   return str;
else if(x.hasLeft())
    recurAndFind("0"+str,x.left,c);
else if(x.hasright())
     recurAndFind("1"+str,x.right,c);
}

这将执行您要执行的操作,但是一旦收到String,您将不得不检查内容是什么,并做出相应的决定。你需要发一个空字符串。