插入二叉树问题的方法
Method to insert into a binary tree problem
我在插入二叉树时遇到问题,以下代码似乎无法按我希望的方式工作。
public static <E extends Comparable<? super E>>
boolean inorderInsert(BTree<E> T, E x) {
BTreeNode<E> n = T.getRoot();
if(T.getRoot() == null) {
T.setRoot(new BTreeNode<E>(x));
}
while (n != null) {
if (x.compareTo(n.getElement()) == 0)
return false;
else if (x.compareTo(n.getElement()) < 0)
if(n.getLeftChild()==null) {
n.setLeftChild(new BTreeNode<E> (x));
}
if(n.getLeftChild()!=null) {
n=n.getLeftChild();
}
else
if(x.compareTo(n.getElement()) > 0) {
if(n.getRightChild()==null) {
n.setRightChild(new BTreeNode<E> (x));
}
if(n.getRightChild()!=null ) {
n=n.getRightChild();
}
}
} // while
return true;
}
具有以下输入:
10 3 8 4 10 5 5 18 19 13
代码产生以下输出:
3 4 5 13 18 19 8 10
而不是:
3 4 5 8 10 13 18 19 10
我正在考虑以一种它会出来的方式制作一棵树:
10
__/ \__
3 18
\ / \
8 13 19
/
4
\
5
我找不到哪里出错了。任何帮助将不胜感激。
从对原始问题的评论来看,您尝试做的似乎是 Tree Sort,这通常更容易实现为递归算法,而不是迭代(while 循环)。我建议查看文献以了解有关该算法的更多信息。
上面代码目前的写法(迭代式,即使用for循环),只会让你每次迭代遍历树的单个节点,使得得到的数据结构是线性的,即每个节点只会有一个child(换句话说,它将等同于一个列表)。
此外,我强烈建议正确缩进代码,因为这样可以更容易准确地理解代码分支到哪里。
当我检查代码时,我发现了错误,这段代码产生了预期的结果。
boolean inorderInsert(BTree<E> T, E x) {
BTreeNode<E> n = T.getRoot();
if(T.getRoot() == null) {
T.setRoot(new BTreeNode<E>(x));
}
while (n != null) {
if (x.equals(n.getElement()))
return false;
else if (x.compareTo(n.getElement()) < 0)
if (n.getLeftChild() == null) {
n.setLeftChild(new BTreeNode<E>(x));
return true;
}
else
n = n.getLeftChild();
else if (n.getRightChild() == null){
n.setRightChild(new BTreeNode<E>(x));
return true;
}
else
n = n.getRightChild();
}
return false;
}
我在插入二叉树时遇到问题,以下代码似乎无法按我希望的方式工作。
public static <E extends Comparable<? super E>>
boolean inorderInsert(BTree<E> T, E x) {
BTreeNode<E> n = T.getRoot();
if(T.getRoot() == null) {
T.setRoot(new BTreeNode<E>(x));
}
while (n != null) {
if (x.compareTo(n.getElement()) == 0)
return false;
else if (x.compareTo(n.getElement()) < 0)
if(n.getLeftChild()==null) {
n.setLeftChild(new BTreeNode<E> (x));
}
if(n.getLeftChild()!=null) {
n=n.getLeftChild();
}
else
if(x.compareTo(n.getElement()) > 0) {
if(n.getRightChild()==null) {
n.setRightChild(new BTreeNode<E> (x));
}
if(n.getRightChild()!=null ) {
n=n.getRightChild();
}
}
} // while
return true;
}
具有以下输入:
10 3 8 4 10 5 5 18 19 13
代码产生以下输出:
3 4 5 13 18 19 8 10
而不是:
3 4 5 8 10 13 18 19 10
我正在考虑以一种它会出来的方式制作一棵树:
10
__/ \__
3 18
\ / \
8 13 19
/
4
\
5
我找不到哪里出错了。任何帮助将不胜感激。
从对原始问题的评论来看,您尝试做的似乎是 Tree Sort,这通常更容易实现为递归算法,而不是迭代(while 循环)。我建议查看文献以了解有关该算法的更多信息。 上面代码目前的写法(迭代式,即使用for循环),只会让你每次迭代遍历树的单个节点,使得得到的数据结构是线性的,即每个节点只会有一个child(换句话说,它将等同于一个列表)。
此外,我强烈建议正确缩进代码,因为这样可以更容易准确地理解代码分支到哪里。
当我检查代码时,我发现了错误,这段代码产生了预期的结果。
boolean inorderInsert(BTree<E> T, E x) {
BTreeNode<E> n = T.getRoot();
if(T.getRoot() == null) {
T.setRoot(new BTreeNode<E>(x));
}
while (n != null) {
if (x.equals(n.getElement()))
return false;
else if (x.compareTo(n.getElement()) < 0)
if (n.getLeftChild() == null) {
n.setLeftChild(new BTreeNode<E>(x));
return true;
}
else
n = n.getLeftChild();
else if (n.getRightChild() == null){
n.setRightChild(new BTreeNode<E>(x));
return true;
}
else
n = n.getRightChild();
}
return false;
}