当前位置: 首页 > 知识库问答 >
问题:

在非二叉树中查找子级(递归)

拓拔麒
2023-03-14

我有TreeNode类——非二叉树(List)节点的实现

我需要在这个节点的子节点中找到第一个包含给定数据的节点。我写了一些方法,但显然存在一些问题(java.lang.AssertionError:找不到包含非空数据的子级:应为:

public TreeNode findChild(Object data) {


    if (data == null) {
        Iterator<TreeNode> a = getChildrenIterator();
        TreeNode tmp;
        while (a.hasNext()) {
            tmp = a.next();
            if (tmp.getData()==null) return tmp;
            tmp.findChild(data);
        }
    }else
    {
        Iterator<TreeNode> a = getChildrenIterator();
        TreeNode tmp;
        while (a.hasNext()) {
            tmp = a.next();
            if (data.equals(tmp.getData())) return tmp;
            tmp.findChild(data);
        }
    }

    return null;
}

共有2个答案

阳文轩
2023-03-14

问题在于你没有返回递归调用的结果。也许下面的代码会有所帮助:

import java.util.*;

public class TreeNode
{
  // Constructor
  public TreeNode()
  {
   children = new ArrayList<TreeNode>();
   node_data = null;
  }

  // Get node's data
  public Object getData()
  {
    return (node_data);
  }

  // Set node's data
  public void setData(Object data)
  {
    node_data = data;
  }

  // Find the node with specified data
  // Return null if not found
  public TreeNode findChild(Object data)
  {
    // Maybe we're the one we're looking for
    if (equalData(data))
      return (this);

    // Search within child nodes
    Iterator<TreeNode> it;
    TreeNode           node;
    it = getChildrenIterator();
    while (it.hasNext())
    {
      node = findChild(it.next());
      if (node != null)
        return (node);
    }

    // If we get here, we didn't find it
    return (null);

  } // findChild

  // Return whether specified data equals ours
  private boolean equalData(Object data)
  {
    if (node_data == null)
      return (data == null);
    else
      return (node_data.equals(data));
  }

  // Return iterator over node's children
  private Iterator<TreeNode> getChildrenIterator()
  {
    return (children.iterator());
  }

  // The node's children
  private List<TreeNode> children;

  // The node's data
  private Object node_data;

} // class TreeNode
柳俊健
2023-03-14

您的递归不正确。如果tmp.findchild()返回非空值,则应返回该结果。

您还需要考虑是否应该执行深度优先或广度优先搜索。

 类似资料:
  • 我希望在BST中找到具有特定值的节点的父节点。我的节点类具有左右属性项(即值/键)。 查找父级的想法是这样的: 1)如果值(key)不存在,则返回无,无 2)如果根等于值(key),则返回无,根 3)否则查找值(key)并返回(par, node),其中par是父级和节点 我的函数是这样的: 当 为“无”时,如何处理该问题?

  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树

  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。

  • 我正在研究一种寻找阳极父级的方法。我从根部开始,然后沿着叶子往下走,只要它们不是空的,不是孩子的节点。 下面是我的代码,它有点乱,因为我试着测试它看看哪里出了问题。