【问题标题】:Pre-order decision binary-tree printout前序决策二叉树打印输出
【发布时间】:2013-09-07 14:52:25
【问题描述】:

这是一个基于预购的决策树 这是树填充代码

Position<Integer> n0 = tree.addRoot(0);
Position<Integer> n1 = tree.insertLeft(n0, 1);
Position<Integer> n3 = tree.insertRight(n0, 3);
Position<Integer> n2 = tree.insertLeft(n1, 2);
Position<Integer> r2 = tree.insertRight(n1, 1);
Position<Integer> r0 = tree.insertLeft(n2, 2);
Position<Integer> r1 = tree.insertRight(n2, 9);     
Position<Integer> r3 = tree.insertLeft(n3, 2);      
Position<Integer> r4 = tree.insertRight(n3, 8);     
Position<Integer> r5 = tree.insertLeft(r4, 4);      
Position<Integer> r6 = tree.insertRight(r4, 5);

下面是我的代码,我尝试将树划分为左子树和右子树,并将它们放入一个数组列表中。但是对于每个部分,还需要考虑这个子树的高度作为循环数

//calculate height of heap
int a = (int) Math.floor(Math.log(tree.size()) / Math.log(2));

List<String> input1 = new ArrayList<String>();
List<String> input2 = new ArrayList<String>();

        Position<Integer> p1 = tree.root();
        Position<Integer> p2 = tree.root();

        //3 is the height of left side heap
        for(int i=0;i<3;i++)
        {       
            //left hand-side
            if (tree.hasLeft(p1) == true && tree.hasLeft(tree.left(p1))==true)
            {   
                input1.add("Y->Q"+tree.left(p1).element());             

                if (tree.hasLeft(tree.right(p1))==true)
                {
                    input1.add("N->Q"+tree.right(p1).element());
                }
                else
                {
                    input1.add("N->R"+tree.right(p1).element());
                }
            }
            else
            {
                input1.add("Y->R"+tree.left(p1).element());
                input1.add("N->R"+tree.right(p1).element());
            }
            p1 = tree.left(p1);

        }   

        //3 is the heap height of right
                for(int n=0;n<3;n++)
                {
                    //right hand-side
                    if (tree.hasRight(p2) == true && tree.hasLeft(tree.right(p2))==true)
                    {                       
                        input2.add("N->Q"+tree.right(p2).element());

                    }
                    else
                    {
                        input2.add("Y->R"+tree.left(p2).element());
                        input2.add("N->R"+tree.right(p2).element());
                    }

                    p2 = tree.right(p2);

                }

但输出是

array input1: [Y->Q1, N->Q3, Y->Q2, N->R1, Y->R2, N->R9]
array input2: [N->Q3, N->Q8, Y->R4, N->R5]

预期的结果应该是

array input1: [Y->Q1, N->Q3, Y->Q2, N->R1, Y->R2, N->R9]
array input2: [Y->R2, N->Q8, Y->R4, N->R5]

我想要的最终结果是

Y->Q1:
   Y->Q2:
      Y->R2
      N->R9
   N->R1
N->Q3:
      Y->R2
      N->Q8
         Y->R4
         N->R5

我知道它可以使用 SringBuilder 为每个子决策使用 3 个空格来完成缩进。但不知道怎么做,在此之前,需要修复'array input2'

这里有新代码

public static void printDecisionTree(BinaryTree<Integer> tree) {    

        Position<Integer> root = tree.root();
        boolean isLeft =true;

        StringBuilder output = new StringBuilder();
        String LS = System.getProperty("line.separator");

           if(tree.hasLeft(root) || tree.hasRight(root)){
               if(isLeft)
                  output.append("Y->Q"+root.element()+LS);
               else
                  output.append("N->Q"+root.element()+LS);
           }
           else{
               if(isLeft)
                  output.append("Y->R"+root.element()+LS);
               else
                  output.append("N->R"+root.element()+LS);
           }
           if (tree.hasLeft(root)&& isLeft==true){
               printDecisionTree(tree);
           }
           if (tree.hasRight(root)&& isLeft==false){
               printDecisionTree(tree);
           }
           System.out.print(output);

    }

【问题讨论】:

  • 其实我不太明白你说的Y->Q/Y->R/N->Q/N->R是什么意思
  • @JohnnyAW 你可以把它们当成字符串,如果是左则为Y,如果右则为N,如果没有子则为R,如果有子则为Q:
  • 好的,但是为什么你期望左数组中有 N->Q3?
  • @JohnnyAW 我只是在想..因为我希望它们都成对出现,所以可能更容易转换为该堆栈输出

标签: java tree binary-tree stringbuilder preorder


【解决方案1】:

实际上,您需要遍历节点并将值放入数组中。 假设你有这个:

public void traverse (Position<Integer> root, List<String> input, boolean isLeft){
   if(tree.hasLeft(root) || tree.hasRight(root)){
       if(isLeft)
          input.add("Y->Q"+root.element());
       else
          input.add("N->Q"+root.element());
   }
   else{
       if(isLeft)
          input.add("Y->R"+root.element());
       else
          input.add("N->R"+root.element());
   }
   if (tree.hasLeft(root)){
       traverse(tree.left(root), input, true);
   }
   if (tree.hasRight(root)){
       traverse(tree.right(root), input, false);
   }
}

像这样在你的函数中使用它:

List<String> input1 = new ArrayList<String>();
List<String> input2 = new ArrayList<String>();

Position<Integer> left = tree.left(tree.root());
Position<Integer> right = tree.right(tree.root());

traverse(left, input1, true);
traverse(right, input2, false);

我希望我没有忘记什么:)

edit1:traverse 现在是静态的 edit2:不,因为树,静态不好......

【讨论】:

  • 但是这个遍历方法如何寻找元素直到这棵树的末尾?
  • 只有当你有一个左孩子或右孩子时,它才会下降。它的递归方法。你可以用迭代的方式来做,但你需要一个堆栈
  • 所以我需要一个布尔值来确定这个孩子是否离开,但我的二叉树接口没有那个方法
  • 你试过我的代码了吗?我认为您不需要其他东西,我只使用了您在代码中使用的东西
  • 我只有一个布尔值表示“是根”、“是内部节点”、“是外部节点”、“有左边”和“有右边”:(
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多