Java二叉树按顺序插入

Posted

技术标签:

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

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

          1
     2         3
   4   5     6   7
 8  9

【问题讨论】:

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

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

inserting into binary trees 或 difference between to types of binary trees 或 how 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 个左右的值。

【讨论】:

以上是关于Java二叉树按顺序插入的主要内容,如果未能解决你的问题,请参考以下文章

设计一个算法把二叉数的叶子结点按从左到右的顺序连成一个单链表,二叉树按ldchild-rchild方式存储,?

二叉树的基本概念

广度优先搜索--二叉树按层遍历

二叉树按层打印

二叉树按层遍历

二叉树按行打印,换行。。。。