将二叉搜索树打印为单个字符串

时间:2018-02-18 00:24:42

标签: java binary-search-tree

我一直在努力的一个练习题,让我很困惑。

定义一个满足以下声明的函数treeLevelOrder: 如果Q是整数的二叉搜索树,则treeLevelOrder(Q)是Q的内容的String表示,根据它们在树中的级别。  我们以此树为例

      9
   /     \
  5       16
 / \     /  \
1   7   12  19

在这种情况下,表达式treeLevelOrder(Q)的值将是 " [9,5,16,1,7,12,19]"

我已经看到了类似的问题,但他们并没有遵循我想要的格式,想要按级别订单打印或按照有序的元组打印。以下是我正在处理的一些示例代码:

 private String treeLevelOrder(Node Q)
 {
   if (Q.left == null && Q.right == null)
       return "[" + Q.datum + "]";
   else if (Q.left == null && Q.right != null)
       return "[" + Q.datum + ", "+Q.right.datum+"]" + treeLevelOrder(Q.right);
   else if (Q.left !=null && Q.right == null)
       return"[" + Q.datum + ", "+Q.left.datum+", *]"+ treeLevelOrder(T.left);
   else
       return "[" + Q.datum + ", "+Q.left.datum+", "+Q.right.datum+"]" + 
              treeLevelOrder(Q.left) + treeLevelOrder(Q.right);          
 } 

任何帮助都会有所帮助。

编辑:好的,所以我一直在Geeks for Geeks尝试水平订单示例,谢谢curlyBraces,这将更接近我所寻找的,尽管我可以&#39 ; t弄明白让它返回一个字符串。这是他们使用的代码:

/* function to print level order traversal of tree*/
void printLevelOrder()
{
    int h = height(root);
    int i;
    for (i=1; i<=h; i++)
        printGivenLevel(root, i);
}
/* Compute the "height" of a tree -- the number of
nodes along the longest path from the root node
down to the farthest leaf node.*/
int height(Node root)
{
    if (root == null)
       return 0;
    else
    {
        /* compute  height of each subtree */
        int lheight = height(root.left);
        int rheight = height(root.right);        
        /* use the larger one */
        if (lheight > rheight)
            return(lheight+1);
        else return(rheight+1); 
    }
}
/* Print nodes at the given level */
void printGivenLevel (Node root ,int level)
{
    if (root == null)
        return;
    if (level == 1)
        System.out.print(root.data + ", ");
    else if (level > 1)
    {
        printGivenLevel(root.left, level-1);
        printGivenLevel(root.right, level-1);
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个使用while循环和两个队列来跟踪所有节点的实现:

    public String treeLevelOrder(Node root) {
        StringBuilder result = new StringBuilder("");
        Queue<Node> current = new LinkedList<>();
        Queue<Node> other = new LinkedList<>();
        if(root != null)
            current.add(root);

        while(!current.isEmpty()) {
            while(!current.isEmpty()) {
                Node node = current.remove();
                result.append(",");
                result.append(node.datum);

                // adding children to the other queue
                if(node.left != null)
                    other.add(node.left);
                if(node.right != null)
                    other.add(node.right);
            }

            // swapping the queues
            Queue<Node> temp = current;
            current = other;
            other = temp;
        }

        // building final string
        if(result.length() == 0)
            result.append("[");
        else
            result.setCharAt(0,'[');
        result.append("]");
        return result.toString();
    }