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二叉树按顺序插入的主要内容,如果未能解决你的问题,请参考以下文章