【问题标题】:get TreeNode by number按编号获取 TreeNode
【发布时间】:2014-08-20 05:04:01
【问题描述】:

我正在从 java 中的二叉树创建一个堆。我的实现如下所示:

public class Heap <P extends Comparable<P>,D> {
  // ATTRIBUTES
  private TreeNode<P,D> root;
  private int size;

  // CONSTRUCTOR
  PriorityQueue() {
    this.root = null;
    this.last = null;
    this.size = 0;
  }

  class TreeNode<P,D> {
    // ATTRIBUTES
    P priority;
    D data;
    TreeNode<P,D> left;
    TreeNode<P,D> right;

    // CONSTRUCTOR
    TreeNode(P priority, D data, TreeNode<P,D> left, TreeNode<P,D> right) {
      this.priority = priority;
      this.data = data;
      this.left = left;
      this.right = right;
    }
    TreeNode(P priority, D data) {
      this(priority, data, null, null);
    }
}

现在我想获取节点的第 n 个元素。我想,将 n 转换为二进制字符串会很聪明,弹出第一个 1,然后每个 0 向左,每个 1 向右。

这似乎不太难,但现在我的问题是,我应该如何创建像 root.left.left.right 这样的输出来到达第 9 个元素。我不只是想得到一个副本,这很容易(参见下面的getNode(int n) 函数),我想要一个对那个节点的引用,所以我可以在那个地方添加一个新节点。

public TreeNode<P,D> getNode(int n) {
  String binString = Integer.toBinaryString(n);
  char[] binChars = binString.substring(1, binString.length()).toCharArray();
  TreeNode<P,D> node = this.root;
  for( char c : getNodePath(n) ){
    if( c == '0' ){
      node = node.left;
    } else if( c == '1' ){
      node = node.right;
    }
  }
  return node;
}

在java中这甚至可能吗?在 python 中,我只需创建一个".left.left.right" 字符串并使用run,但这在 java 中似乎是不可能的。

【问题讨论】:

    标签: java data-structures heap binary-tree binary-heap


    【解决方案1】:

    按照您构建数据的方式,您需要的不是对节点 n 的引用(您已经获得),而是对其父节点的引用。

    所以对于 .left.left.right

    你需要剪掉最后一点,用.left.left调用getNode

    这将为您提供节点的父节点。您可以使用返回的父节点并使用您切断的位(.right)来引用目标节点本身

    parent.right

    同样你可以通过 parent.right = new-node 重新分配节点

    顺便说一句,您不需要创建二进制字符串来实现您的方案。您只需要使用移位运算符和“按位与”

    【讨论】:

    • 那么,我为什么要去找父母,只去找孩子有什么问题?还有我如何最好地返回父级以及左或右的数字,因为java中没有元组。 (对不起,我是 java 新手)
    • 哦,明白了。我当然需要改变父母的权利,真正改变父母的权利,面团。我可以用 n//2 去父母那里,用 n%2 得到左边或右边的值。
    • 是的,这或多或少是你必须做的,但我感觉你正在混合一些东西并且做的比必要的多。例如,如果您使用二进制方案,那么 getNode(n >> 1) 将给您您的父母, (n & 1) 将告诉您是左孩子还是右孩子。两者都是按位运算符 - 在 python 中应该相同。我没有看到您已经接受了答案,但无论如何很高兴知道这大约是您正在寻找的。是的,一门新语言需要一些时间来适应。
    • 我会接受答案,一旦我让一切运行起来。所以我还没有得到的是如何只用按位运算来实现getNode,因为我需要从数字的左边开始,但可以用>>移开右边的部分
    • 好吧,原来的东西不是按位计算的。但是,由于我提到使用按位运算符,所以在我离开您的实现之前,我只给您一种方法:)。 boolean isMSBSet(int i){ return (Integer.MIN_VALUE &amp; i) &lt; 0; } 所以如果你在循环中调用 isMSBSet(i
    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多