【问题标题】:Java Binary Tree Insert in OrderJava二叉树按顺序插入
【发布时间】:2015-07-16 19:27:40
【问题描述】:

如何在java中将项目插入二叉树以使它们按顺序排列?我想使用随机值并将它们从最小到最大排序,然后按以下顺序将它们插入二叉树:

          1
     2         3
   4   5     6   7
 8  9

【问题讨论】:

  • 这并不完全清楚。这里的数字是什么意思;它们是值,还是代表您添加内容的顺序?
  • 如果是后者,那么这应该是比较容易的。如果是前者,则每次插入时都需要移动一堆东西。
  • @OliverCharlesworth 很清楚。他想要一棵完整的二叉树。
  • @alifirat 它不是二叉搜索树,只是二叉树(完整)
  • 它们只是我要添加值的顺序。

标签: java binary-tree


【解决方案1】:

当您说“按顺序”时,您需要澄清一下,您是指按排序顺序还是按插入顺序等。

inserting into binary treesdifference between to types of binary treeshow to print a binary tree diagram 上有很多可用资源,我怀疑这是重复的。

你的例子有什么不同?将“1”作为根节点意味着您不能有再平衡树,因为“2”和“3”都大于根节点的值。您的插入规则似乎不一致,因为如果“1”是插入的第一个节点,那么所有其他值将级联到树的右分支,除非您对根使用不同的规则,然后在其他级别使用不同的规则,这将是一个痛苦的编码。

【讨论】:

    【解决方案2】:

    像这样?:

    public class BinaryTree {
        private List<Integer> list = new ArrayList<Integer>();
    
    
        public class BinaryTreeNode {
            private int p;
    
            public BinaryTreeNode(int p) {
                this.p = p;
            }
    
            private BinaryTreeNode getChild(int childP){
                BinaryTreeNode result= null;
                if (childP < list.size()){
                    result = new BinaryTreeNode(childP);
                }
                return result;
            }
    
            public BinaryTreeNode getLeft(){
                return getChild(p*2+1);
            }
    
            public BinaryTreeNode getRight(){
                return getChild(p*2+2);
            }
    
            public int getValue(){
                return list.get(p);
            }
        }
    
        public void add(int item){
            list.add(item);
        }
    
        public BinaryTreeNode getRoot(){
            BinaryTreeNode result = null;
            if (!list.isEmpty()){
                result = new BinaryTreeNode(0);
            }
            return result;
        }
    }
    

    【讨论】:

      【解决方案3】:

      Naftalin, Walder Java Collections and Generics 中,我遇到了我最喜欢的这个实现:

      public interface TreeVisitor<E, R> {
          public R visit(E leaf);
      
          public R visit(E value, Tree<E> left, Tree<E> right);
      }
      
      public abstract class Tree<E> {
      
          public abstract <R> R accept(TreeVisitor<E, R> visitor);
      
          public static <E> Tree<E> leaf(final E leaf) {
              return new Tree<E>() {
                  @Override
                  public <R> R accept(TreeVisitor<E, R> visitor) {
                      return visitor.visit(leaf);
                  }
              };
          }
      
          public static <E> Tree<E> branch(final E value, final Tree<E> left, final Tree<E> right){
              return new Tree<E>(){
                  @Override
                  public <R> R accept(TreeVisitor<E, R> visitor) {
                      return visitor.visit(value, left, right);
                  }
              };
          }
      }
      

      现在您可以添加任何您想要的操作并创建您的树,如下所示:

      Tree<Integer> t = Tree.branch(1, 
                  Tree.branch(2, 
                      Tree.branch(4, Tree.leaf(8), Tree.leaf(9)), Tree.leaf(5)),
                      Tree.branch(3, Tree.leaf(6), Tree.leaf(7));
      

      【讨论】:

      • 这似乎是一个很好的实现,但我正在寻找更传统的东西,就像其他答案显示的那样。
      • @Relindrani 请注意,该实现是完全线程安全的,因为您没有可以修改的变量。我自己在我们的项目中使用它。
      【解决方案4】:

      我从这篇文章中找到了我需要的答案。

      Create a Complete Binary Tree using Linked Lists w/o comparing node values

      我被指出的其他一些东西,要么不是我想要的,要么没有超过 8 个左右的值。

      【讨论】:

        猜你喜欢
        • 2011-06-22
        • 2011-09-27
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 2011-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多