我一直试图让这个Graph伪装成二叉树工作。目前我正在使用一个传递根节点的函数和我正在寻找的节点的ID。唯一的问题是,根据我的编码方式,我的一方可能永远不会超过3个节点。我确定我只是没有正确地进行递归。我整夜都被困在这里,无法得到这个。我试过看其他图形和树木,但没有用。我们没有使用实际顶点或其他类似图形的属性,但我不能只使用if (x <root.getID())
然后使用root.left,因为它仍然没有用,因为它仍然是“图形”
这是我的非工作搜索算法,如果我将其设置为几个节点,它将停止在右侧工作。访问过的是使用HashSet()类。
private Node dfs(Node x, int id)
{
if (x==null) //base case. Runs into null link
return null;
if(visited.contains(x.getID())) //visited before
return null;
visited.add(x.getID()); //don't go below Node again
if(id==x.getID())
return x;
Node rc = dfs(x.getRightChild(), id);
Node lc = dfs(x.getLeftChild(), id);
//recursive calls
if (lc.getID()==id)
return lc;
if(rc.getID()==id)
return rc;
return null;
}
我有一个用于打印所有树的工作代码,但我无法在上面的代码中更改密钥比较。
private String dfsPrint(Node x) //pass in root at top level
//returns a String containing all ID's
{
if (x==null) //base case. Runs into null link
return "";
if(visited.contains(x.getID())) //visited before
return "";
visited.add(x.getID()); //don't go below Node again
String lc = dfsPrint(x.getLeftChild()); //recursive stuffs
String rc = dfsPrint(x.getRightChild());
return Integer.toString(x.getID()) + " " + lc + rc;
}
感谢您的帮助。
编辑:我想我会扩展我正在做的事情。我必须有一个函数makeRight或makeLeft放入一个新节点,然后一个现有节点让它有左或右子节点。 就是这样。在其中,search是调用私有dfs的公共方法。
Node search(int id) // calls private dfsSearch() returns null or a ref to
// a node with ID = id
{
int ID = id;
Node x= dfs(root, ID);
return x;
}
void ML(int x, int y) // ML command
{
visited.clear();
Node temp = new Node(y, null, null);
Node current = search(x);
current.putLeft(temp);
}
void MR(int x, int y)//MR command
{
visited.clear();
Node temp = new Node(y, null, null);
Node current = search(x);
current.putRight(temp);
}
根据我对lc和rc语句的递归函数的命令,树的另一面会被递归回基本情况,这就是我假设dfs方法出错的原因。这是请求的节点类。
class Node {
private int ID; //ID of the Node. Distinct
private Node leftChild;
private Node rightChild;
Node(int identification)//constructor
{
ID = identification;
}
Node(int identification, Node lt, Node rt) //constructor
{
ID = identification;
leftChild = lt;
rightChild = rt;
}
int getID()
{
return ID;
}
Node getLeftChild()
{
return leftChild;
}
Node getRightChild()
{
return rightChild;
}
void putLeft(Node lt)
{
leftChild = lt;
}
void putRight (Node rt)
{
rightChild = rt;
}
}
答案 0 :(得分:1)
你可以简化代码。我认为你不需要'id'。怎么样?
private dfs(Node x, int id) {
if (x==null) { //base case. Runs into null link
return;
}
if(visited.contains(x)) { //visited before
return;
}
visited.add(x); //don't go below Node again
dfs(x.getRightChild());
dfs(x.getLeftChild());
}
答案 1 :(得分:0)
在某些情况下,dfs
方法会返回null。当您尝试在这样的返回值上调用getId()
时,您应该得到一个例外。不是吗?