Recursion 查找树中给定距离内的元素
我有一棵树,作为某些元素,我有一个方法,基本上返回一个距离内的元素列表 范例 在上面的树中,一旦我有了我的方法,我应该能够输入数据和距离。假设我输入的数据是1,距离是2。在这种情况下,该方法应该输出元素[2,3,4],因为我应该能够输出小于或等于给定距离的数据 我知道如何输出距离为2的数据,但我很难包含距离为1的数据Recursion 查找树中给定距离内的元素,recursion,tree,distance,Recursion,Tree,Distance,我有一棵树,作为某些元素,我有一个方法,基本上返回一个距离内的元素列表 范例 在上面的树中,一旦我有了我的方法,我应该能够输入数据和距离。假设我输入的数据是1,距离是2。在这种情况下,该方法应该输出元素[2,3,4],因为我应该能够输出小于或等于给定距离的数据 我知道如何输出距离为2的数据,但我很难包含距离为1的数据 void printkdistanceNodeDown(Node node, int k) { if (node == null || k
void printkdistanceNodeDown(Node node, int k)
{
if (node == null || k < 0)
return;
if (k == 0)
{
System.out.print(node.data);
System.out.println("");
return;
}
// Recur for left and right subtrees
printkdistanceNodeDown(node.left, k - 1);
printkdistanceNodeDown(node.right, k - 1);
}
int printkdistanceNode(Node node, Node target, int k)
{
if (node == null)
return -1;
if (node == target)
{
printkdistanceNodeDown(node, k);
return 0;
}
// Recur for left subtree
int dl = printkdistanceNode(node.left, target, k);
// Check if target node was found in left subtree
if (dl != -1)
{
if (dl + 1 == k)
{
System.out.print(node.data);
System.out.println("");
}
else
printkdistanceNodeDown(node.right, k - dl - 2);
// Add 1 to the distance and return value for parent calls
return 1 + dl;
}
// MIRROR OF ABOVE CODE FOR RIGHT SUBTREE
// Note that we reach here only when node was not found in left
// subtree
int dr = printkdistanceNode(node.right, target, k);
if (dr != -1)
{
if (dr + 1 == k)
{
System.out.print(node.data);
System.out.println("");
}
else
printkdistanceNodeDown(node.left, k - dr - 2);
return 1 + dr;
}
// If target was neither present in left nor in right subtree
return -1;
}
void printkdistanceNodeDown(节点节点,int k)
{
if(node==null | | k<0)
返回;
如果(k==0)
{
系统输出打印(节点数据);
System.out.println(“”);
返回;
}
//左子树和右子树的递归
printkdistanceNodeDown(node.left,k-1);
printkdistanceNodeDown(node.right,k-1);
}
int printkdistanceNode(节点节点,节点目标,int k)
{
if(node==null)
返回-1;
如果(节点==目标)
{
printkdistanceNodeDown(节点,k);
返回0;
}
//左子树的递归
int dl=printkdistanceNode(node.left,target,k);
//检查是否在左子树中找到目标节点
如果(dl!=-1)
{
如果(dl+1==k)
{
系统输出打印(节点数据);
System.out.println(“”);
}
其他的
printkdistanceNodeDown(node.right,k-dl-2);
//为父呼叫的距离和返回值添加1
返回1+dl;
}
//右子树的上述代码的镜像
//请注意,我们仅在左侧未找到节点时才到达此处
//子树
int dr=printkdistanceNode(node.right,target,k);
如果(dr!=-1)
{
如果(dr+1==k)
{
系统输出打印(节点数据);
System.out.println(“”);
}
其他的
printkdistanceNodeDown(node.left,k-dr-2);
返回1+dr;
}
//如果目标既不存在于左子树中,也不存在于右子树中
返回-1;
}
解释第二个函数中的目标是什么,以及为什么有两个递归函数您的问题是否只适用于第一个函数?如果是这样,答案很简单。目标函数本质上就是您必须找到的节点,并且能够找到距离该节点一定距离的节点。打印距离给定目标节点k处的所有节点。此函数返回距离目标节点的根的距离b但为什么需要两个节点
和目标
?那么节点的目的是什么?如果你的输入只是一个节点和一个距离,为什么你有3个参数?…也许我的思维过程是错误的。我基本上是在给定数据的一定距离内找到所有元素。我基本上计划使用两种辅助方法,其中第一种方法添加路径上的节点(根到目标节点),并基本上查找路径上的节点和目标节点之间的距离。我的第二个基本上会添加孩子,如果他们在距离之内。有没有更简单的方法?如果是的话,将如何进行?