Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在二叉树中查找子节点的父节点_Java_Algorithm_Binary Tree - Fatal编程技术网

Java 在二叉树中查找子节点的父节点

Java 在二叉树中查找子节点的父节点,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,我试图创建一个函数,该函数获取子节点和二叉树,并返回给定子节点的父节点。如果给定的子节点是根节点,则应返回null。 这就是我想做的: //input : The function gets a binary tree and a child node //output : The function returns the parent of a given child of the tree, if the given child is the root //then it will retu

我试图创建一个函数,该函数获取子节点和二叉树,并返回给定子节点的父节点。如果给定的子节点是根节点,则应返回null。 这就是我想做的:

//input : The function gets a binary tree and a child node
//output : The function returns the parent of a given child of the tree, if the given child is the root
//then it will return null
public static BinTreeNode<Character> Parent(BinTreeNode<Character> bt, BinTreeNode<Character> child){
    if(bt==null){
        return bt;
    }
    else{
        if(bt.hasLeft()&&(bt.hasRight())){
            if((bt.getLeft().getValue()==child.getValue())||(bt.getRight().getValue()==child.getValue())){
                return bt;
            }
            else{
                Parent(bt.getLeft(),child);
                Parent(bt.getRight(),child);

            }
        }
        if(bt.hasLeft()){
            if(bt.getLeft().getValue()==child.getValue()){
                return bt;
            }
            else{
                return Parent(bt.getLeft(),child);
            }
        }
        if(bt.hasRight()){
            if(bt.getRight().getValue()==child.getValue()){
                return bt;
            }
            else{
                return Parent(bt.getRight(),child);
            }
        }
    }
    return null;
}
//输入:函数获取一个二叉树和一个子节点
//输出:如果树的给定子级是根,则该函数返回树的给定子级的父级
//然后它将返回null
公共静态BinTreeNode父级(BinTreeNode bt,BinTreeNode子级){
if(bt==null){
返回bt;
}
否则{
if(bt.hasleet()&&(bt.haslright()){
如果((bt.getLeft().getValue()==child.getValue())| |(bt.getRight().getValue()==child.getValue()){
返回bt;
}
否则{
父项(bt.getLeft(),子项);
父项(bt.getRight(),子项);
}
}
if(bt.hasleet()){
if(bt.getLeft().getValue()==child.getValue()){
返回bt;
}
否则{
返回父项(bt.getLeft(),子项);
}
}
if(bt.hasRight()){
if(bt.getRight().getValue()==child.getValue()){
返回bt;
}
否则{
返回父项(bt.getRight(),子项);
}
}
}
返回null;
}
出于某种原因,它一直返回null,调试后,我看到当它到达第一个条件时,它会检查它是否等于,但不是继续向其他条件递归,而是我告诉它要做的事情,它只是开始在底部返回null,我不知道为什么?
我将非常感谢我对java的任何帮助。

在返回之前,您需要遍历树

您的实现只是向左走,然后返回null(可能您的孩子在右边)

试试这样:

public static BinTreeNode<Character> getParent(BinTreeNode<Character> 
bt, BinTreeNode<Character> child){
    if(bt==null){
        return bt;
    }
    BinTreeNode<Character> left = null;
    BinTreeNode<Character> right = null;
    if(bt.hasLeft()){
        if(bt.getLeft().equals(child))
            return bt;
        left = getParent(bt.getLeft(),child);
    }
    if(left == null){
        if(bt.hasRight()) {
            if(bt.getRight().equals(child))
                return bt;
            right = getParent(bt.getRight(),child);
        }
    } else {
        return left;
    }
    return right;
}
publicstaticbintreenodegetparent(BinTreeNode
bt,BinTreeNode(儿童){
if(bt==null){
返回bt;
}
bintreenodeleft=null;
BinTreeNode right=null;
if(bt.hasleet()){
if(bt.getLeft().equals(child))
返回bt;
left=getParent(bt.getLeft(),child);
}
if(left==null){
if(bt.hasRight()){
if(bt.getRight().equals(child))
返回bt;
right=getParent(bt.getRight(),child);
}
}否则{
左转;
}
返还权;
}

这里我们有一个深度优先搜索的实现。

问题是,您将只检查所有剩余的子项。因此,您的代码只适用于左边的儿童(左边的儿童,等等)。到达底部后,返回
null
,就是这样

要修复此问题,请将代码更改为以下内容:

public static BinTreeNode<Character> parent(BinTreeNode<Character> bt, BinTreeNode<Character> child) {
    if (bt == null) {
        return bt;
    } else {
        if (bt.hasLeft()) {
            if (bt.getLeft().equals(child)) {
                return bt;
            }

            BinTreeNode<Character> possibleParent = parent(bt.getLeft(), child);
            if (possibleParent != null) {
                return possibleParent;
            }
        }

        if (bt.hasRight()) {
            if (bt.getRight().equals(child)) {
                return bt;
            } else {
                return parent(bt.getRight(), child);
            }
        }

        return null;
    }
}
公共静态BinTreeNode父节点(BinTreeNode bt,BinTreeNode子节点){
if(bt==null){
返回bt;
}否则{
if(bt.hasleet()){
if(bt.getLeft().equals(child)){
返回bt;
}
BinTreeNode possibleParent=parent(bt.getLeft(),child);
if(可能租金!=null){
可能的回报;
}
}
if(bt.hasRight()){
if(bt.getRight().equals(child)){
返回bt;
}否则{
返回父项(bt.getRight(),子项);
}
}
返回null;
}
}

如果递归调用的值不为null,则需要返回这些值:
返回Parent(bt.getLeft(),child)etcMy父函数获取一个字符树-a是根,e left child有两个子c left和b right,g right child(((null c null)e(null b null))a((null d null)g null))以及我在其中创建新节点的子节点BinTreeNode child=new BinTreeNode('e');BinTreeNode ParentNode=Parent(t,child);我得到了返回值,然后删除了它,我还决定删除两个子项都不为null的条件,因为我只想遍历所有的左子项和右子项,直到找到它的父项为止,但是,它仍然返回null如果节点没有左子项,你就永远不会检查右子项。谢谢,它工作了!你能解释一个例子吗关于你实际做了些什么?我拼命地试图遍历整个树,因此有很多条件,但我只检查了其中的一个方面,而在我过去使用的其他递归方法中,我能够遍历整个树,编写类似于return(t.getLeft())和&(t.getRight())的内容但这一次我不同意。所以你能用语言解释一下你做了什么吗?我有点理解,但不完全理解。无论如何,我非常感谢你的帮助。事实上,唯一的区别是,我们不是直接从递归调用返回,而是将结果存储在变量中。因此,你总是尝试先向左,然后只向左ht when left返回null。您所做的几乎是正确的,但是您直接在左侧检查时返回(从不检查右侧的子项)。