【问题标题】:How to perform BFS from the bottom to up of tree for MINMAX algorithm?如何为 MINMAX 算法从树的底部到顶部执行 BFS?
【发布时间】:2014-07-21 19:10:18
【问题描述】:

每个节点都有一个ArrayList<Node> 的子节点。

叶子已经被评估过。我想逐级为叶子以上的所有节点设置值,所以我必须为某个级别的所有节点设置值才能转到它们的父节点并为它们设置值。

换句话说1 假设在X 级别的节点设置之前,X-1 级别的节点设置

换句话说2:我需要设置node.evaluation = 1,对于X 层的所有叶子,在我更接近根之前。

如何做到这一点?我在下面尝试过,但似乎是错误的。我现在尝试了一周。

evaluateTree2(root);
    ....
public void evaluateTree2(Node node){
        for(Node descendant  : node.children) {
            evaluateTree2(descendant);  
            node.evaluation = 1;
            }       
}

【问题讨论】:

  • 树的底部通常是叶子
  • @martijnn2008 是的,我想从叶子开始并逐级返回根,我需要设置 node.evaluation = 1,对于 X 层上的所有叶子,然后再靠近根.

标签: java recursion tree depth-first-search breadth-first-search


【解决方案1】:

您可以使用堆栈和队列。用于从下到上逐级打印节点的伪代码:(请注意,将子节点放入 my_queue 的顺序可能对您的应用程序很重要)。

时间复杂度为 O(n)。在堆栈和队列中插入和弹出都是 O(1),给定 n 个元素和 n 个弹出和插入,总顺序是线性的,即 O(n)。

Stack my_stask
Queue my_queue

insert tree.root into my_queue

while my_queue != empty
  pop Node node from my_queue
  push node.children into my_queue
  push node into my_stask

while my_stask != empty
  pop Node node from my_stask
  print node

【讨论】:

  • 能否附上任何我不明白的代码,我看不到递归。
  • 你需要递归吗?
  • 不,它没有,但我不明白你写了什么。 “将一个节点放入队列中,弹出它”那么如果将它弹出到下一行,为什么还要放入呢?还有如何在没有递归的情况下遍历树。
  • 最后我使用了TreeMap<Integer, ArrayList<Node>>。 java中的队列在添加元素时具有线性时间复杂度。
  • 据我所知,在大多数标准库中推送和弹出队列的时间复杂度为 O(1)。即使在 Java 中什么都没有,您也可以始终使用链表来实现。如果您找到了其他解决方案,请提供代码吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2012-06-01
  • 1970-01-01
  • 2011-01-18
  • 2021-08-19
  • 2017-12-28
  • 2015-11-11
相关资源
最近更新 更多