Recursion 查找树中给定距离内的元素

Recursion 查找树中给定距离内的元素,recursion,tree,distance,Recursion,Tree,Distance,我有一棵树,作为某些元素,我有一个方法,基本上返回一个距离内的元素列表 范例 在上面的树中,一旦我有了我的方法,我应该能够输入数据和距离。假设我输入的数据是1,距离是2。在这种情况下,该方法应该输出元素[2,3,4],因为我应该能够输出小于或等于给定距离的数据 我知道如何输出距离为2的数据,但我很难包含距离为1的数据 void printkdistanceNodeDown(Node node, int k) { if (node == null || k

我有一棵树,作为某些元素,我有一个方法,基本上返回一个距离内的元素列表

范例

在上面的树中,一旦我有了我的方法,我应该能够输入数据和距离。假设我输入的数据是1,距离是2。在这种情况下,该方法应该输出元素[2,3,4],因为我应该能够输出小于或等于给定距离的数据

我知道如何输出距离为2的数据,但我很难包含距离为1的数据

    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个参数?…也许我的思维过程是错误的。我基本上是在给定数据的一定距离内找到所有元素。我基本上计划使用两种辅助方法,其中第一种方法添加路径上的节点(根到目标节点),并基本上查找路径上的节点和目标节点之间的距离。我的第二个基本上会添加孩子,如果他们在距离之内。有没有更简单的方法?如果是的话,将如何进行?