java - Java中递归生成树

标签 java recursion tree stack-overflow

我正在尝试构建一棵树,其中每个节点有六个子节点。我编写的用于生成树 genB 的方法导致堆栈溢出。

public class TreeTest
{   

    public static void main(String Args[])
    {   
        sBNode bTree;
        sWNode wTree;

        bTree = new sBNode();
        wTree = new sWNode();

        TreeTest ai = new TreeTest();       

        bTree.depth = 0;
        System.out.println(bTree.depth);
        ai.genB(bTree, 2);
        ai.printTree(bTree);    
    }

    public Treetest()
    {

    }

    public boolean leaf(sBNode node)
    {
        if(node.pe1==null && node.pe2==null && node.pe3==null && node.ee1==null && node.ee2==null && node.ee3==null)
            return true;
        else
            return false;
    }

    public void genB(sBNode parent, int ddepth)
    {
        int pdepth;

        if(parent.depth != ddepth)
        {           
            System.out.println(parent.depth);
            pdepth = parent.depth++;
            sBNode pe1 = new sBNode();
            sBNode pe2 = new sBNode();
            sBNode pe3 = new sBNode();  
            sBNode ee1 = new sBNode();
            sBNode ee2 = new sBNode();
            sBNode ee3 = new sBNode();

            pe1.depth = pdepth;
            pe2.depth = pdepth;
            pe3.depth = pdepth;
            ee1.depth = pdepth;
            ee2.depth = pdepth;
            ee3.depth = pdepth;
            pe1.parent = parent;
            pe2.parent = parent;
            pe3.parent = parent;
            ee1.parent = parent;
            ee2.parent = parent;
            ee3.parent = parent;

            genB(pe1, ddepth);
            //genB(pe2, ddepth);
            //genB(pe3, ddepth);
            //genB(ee1, ddepth);
            //genB(ee2, ddepth);
            //genB(ee3, ddepth);            
        }       
    }

    public void printTree(sBNode node)
    {
        while(!leaf(node))
        {
            System.out.println(node.depth);
            printTree(node.pe1);
            printTree(node.pe2);
            printTree(node.pe3);
            printTree(node.ee1);
            printTree(node.ee2);
            printTree(node.ee3);
        }
    }
}

final class sBNode
{   
    public String state = "BCXXXCXXX";

    //utility value
    public boolean war;
    public int score;
    public int oscore;
    public int utility;
    public int min;
    public int max;
    public int depth;

    sBNode pe1;
    sBNode pe2;
    sBNode pe3; 
    sBNode ee1;
    sBNode ee2;
    sBNode ee3;
    sBNode parent;

    public sBNode()
    {
        war = false;
        score = 0;
        oscore = 0;
        utility = 0;
        min = 0;
        max = 0;
        depth = 0;
    }
}

这是家庭作业项目的一部分,最终目标是使用树搜索来设计一个游戏,所以我并不真正想要一个直接的答案,而是暗示是什么导致了(接近)无限递归。

最佳答案

发现您的问题:

pdepth = parent.depth++;

应该是:

pdepth = parent.depth + 1;

您是后递增,这意味着首先执行赋值,然后执行增量。 pdepth 的值始终为零。

关于java - Java中递归生成树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127163/

相关文章:

loops - 如何遍历递归/嵌套 HashMap 中的所有键?

javascript - 从数组动态生成嵌套树对象

java - Spring使用java配置在 session 范围内定义一个bean

Java红外设备

javascript - 创建一个与另一个形状相同的树数据结构

function - 返回列表的立方体函数的 CLISP 递归幂

通过堆栈跟踪的 Java 反射

java - 从外观上使用标准按钮

java - 如何使用java在Oracle sql中存储目录结构

c - 使用字符串路径将列表链接到文件,它是正确的实现吗?