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

具有左右子访问的节点树遍历

洪念
2023-03-14

试图遍历一棵树并为我的数组获取空值。我需要遍历只允许访问节点类的类定义中没有根的右和左子级的树。

class Tree<T> {
 Tree(T x) {
   value = x;
 }
 T value;
 Tree<T> left;
 Tree<T> right;
}

public int[] traverseTree(Tree<Integer> t) {
   Stack<Tree<Integer>> stack = new Stack<Tree<Integer>>();
    Tree<Integer> node = root;

    while (node != null) { 
        stack.push(node);
        node = node.left;
    }

    int[] result = new int[stack.size()];
    int i = 0;
    while (stack.size() > 0) {
        node = stack.pop();
        if(node != null) {
            result[i] = node.value;
            i++;
        }
        if (node.right != null) {
            node = node.right;

            while (node != null) {
                stack.push(node);
                node = node.left;
            }
        }
    }

    return result;
}

它需要输入

t = {
"value": 1,
"left": {
    "value": 2,
    "left": null,
    "right": {
        "value": 3,
        "left": null,
        "right": null
    }
},
"right": {
    "value": 4,
    "left": {
        "value": 5,
        "left": null,
        "right": null
    },
    "right": null
   }
 }

这应该返回[1,2,4,3,5],我得到了[]。我也尝试过像这样循环

 if(root != null) {
     queue.add(root);
  }

 while(root.left != null) {
   while(root.right != null) {
      queue.add(root);
      root = root.right;
   }
   queue.add(root);
   root = root.left;
}

这也不管用。这也会给我一个[]数组。遍历应该从左到右在树高(即树高)指示的树级别上打印树。有什么想法吗?

共有1个答案

沈乐邦
2023-03-14

信息技术应该返回t=[1,2,4,3,5],我得到[]。

好吧,让我们看看您用来填充队列的for循环:

for (Tree<Integer> node = root; node != null; node = queue.poll()) {
    //stuff
}

这里所做的是循环,直到queue.poll()返回null,如果我们查看ArrayDeque的javadoc,我们会看到投票()

检索并删除此deque表示的队列的头部(换句话说,此deque的第一个元素),或者如果此deque为空,则返回null。

所以,基本上你是在循环,直到你的队列是空的,然后根据它的大小创建一个数组来返回。因为它的大小总是零,所以你总是返回一个零长度的数组。

看起来你要做一个预序遍历,所以你需要做的是用一个合适的算法重写你的方法。

如果你致力于非递归遍历,这里有一个算法可以实现。

 类似资料:
  • 我遇到了这个问题:下面的方法必须返回左侧子节点中的值,或者-1(如果它不存在)。 现在,参数是一个int值,它指示父节点的值。另一个问题是...树不是有序的,只有正整数值。所以,我可以在根中有一个0的值,在左边的子项中有3的值,在右边的子项中有1的值,以此类推...我想不出该怎么解决这件事。我不能将像LinkedList或Stack这样的ADT用于任何目的。二叉树类有一个字段根,类型为node:

  • 我有一个左右兄弟姐妹,如下所示: 我想从根节点遍历到最后一个节点,遍历函数如下: 正如我所理解的,如果节点有一个子节点,那么指针指向它的子节点,否则指向同级节点(下一个)。在这种情况下,当指针指向元素6时,它将转到根- 下面是重新创建树的代码:

  • 我希望生成一个可视化xml文件结构的图形。 我创建了一个节点列表来表示xml文件 每个节点包含3个字符串:xml标记、属性和内容。 xml 文件如下所示: 我希望通过枚举节点列表,使用Plotly和igraph库生成一个树形图。 我在这里使用这个网站作为参考。 我的XML文件包含子元素数量可变的元素。然而,给出的例子只向我展示了如何开发一个具有固定数量的子节点的树(这个例子展示了每个节点2个子节点

  • 如果我没弄错的话,树通常是一个列表,其中的元素按特定顺序排列。孩子们不在他们自己的子列表中,他们都在同一个列表中。 所以,我试图创建一个Tree类,其中包含TreeNodes(类)使用Tree类中的List。 我如何跟踪父母/孩子/叶子?如果父母“父母1”,有两个孩子“孩子A”和“孩子B”,我如何将他们联系在一起?

  • 我有一个二叉树,每个节点上都有一个单词。 在另一个类中,我需要逐个访问节点,然后操作单词。从另一个类逐个访问节点的最佳方法是什么? 在我的币树类中,每个节点都有一个左子、右子和一个值(String)。我有三个方法,printinorder-,插入和find节点。查找节点接收一个字符串,并查看该字符串是否存储在任何节点值中。 我有另一个类,需要一个接一个地获取节点,但是我不确定从另一个类中获取的最佳

  • 在具有父子指针的通用树结构中,是否可以在不遍历完整树的情况下遍历叶节点?例如,从最左边的叶节点开始。想法是在深树上进行优化。