一般的想法是使用递归回溯(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
我感谢任何帮助!
答案 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,您将不得不检查内容是什么,并做出相应的决定。你需要发一个空字符串。