递归地将位置分配给二叉搜索树中的节点

时间:2014-10-30 18:27:47

标签: java recursion tree

您好我正在寻找一种方法来递归地将树的位置分配给一个int索引,这样就可以将该位置的节点值放入一个数组中。

所需的树位置按照水平顺序指定,其中根位置为1(i),i的左子节点位于2i,右子节点为2i + 1 - 类似于堆结构。无子女不会获得分配给他们的职位。

        1
       / \
      2   3
     /\   /\
    4  5 6  7
       ...

 [1, 2, 3, 4, 5, 6, 7. ...]

树中最大的位置应该是数组的大小。将空值添加为"空格"我的输出需要测试节点值。

private int largestPos
// first call: assignPositions(root, 1)
assignPositions(node cur, int pos) {
   parent = new node;
   if curpos > largestPos
      largestPos = curPos

   if cur == null
      parent.pos = pos
   else
     current.pos = pos

   parent = cur
   if cur.left != null
      pos = 2 * pos
      assignPositions(cur.left, pos)
   if cur.right != null
      pos = 2 * pos + 1
      assignPositions(cur.right, pos)
}

当我尝试打印出我的数组时,我得到了正确分配的前两个值,然后一个没有值的大块空值(在树中已经确认)不在树中。

我希望这样做可以找出在树中删除后我需要的数组的最小大小。

更新breadthfirstsearch数组:

public Key[] breadthFirstTraversal() {

    @SuppressWarnings("unchecked")
    Key[] keysFinal = new Key[largestPos];

    List<Key> queue = new List<Key>();
    List<Key> keysList = new List<Key>();
    List<Integer> positions = new List<Integer>();

    if (!isEmpty()) {
        Node tempNode = root;
        KeyValuePair<Key, Value> tempKey = null;

        queue.add(tempNode);

        while (!queue.isEmpty()) {
            queue.reset();
            tempKey = queue.remove();
            keysList.add(tempKey);

            tempNode = findKey(tempKey.getKey(), root);

            // adds keys in order on level in list
            if (tempNode.getLeftChild() != null) {
                queue = addAtEnd(queue, tempNode.getLeftChild());
            }
            if (tempNode.getRightChild() != null) {
                queue = addAtEnd(queue, tempNode.getRightChild()); 
            }
        }

        for (int i = 1; i < largestPos + 1; i++) {
            keysList.reset();
            tempKey = keysList.remove();
            tempNode = findKey(, root);
            if (tempNode.getPosition() == i) {
                keysFinal[i - 1] = tempKey;
            } else {
                keysFinal[i - 1] = null;
            }
        }
    }

    return keysFinal;
}

1 个答案:

答案 0 :(得分:0)

您正在将pos更改为在左子树上工作,但随后希望原始值在右侧子树上工作。因此,请不要更改pos,只需将所需的表达式放入assignPositions的调用中。

然后,您继续为您访问的每个节点创建新节点,而且我没有看到任何阵列,因此问题不仅仅是那个。