我理解整数上的二叉搜索树,因为我知道左边的孩子必须小于节点,而右边的孩子必须大于节点,当涉及到“char”或“string”类型时,它完全不同的情况,我们不能说('a' < 'b')或任何其他逻辑操作。
这是我的二叉树http://share.pho.to/89JtW我不能工作,因为每次我插入到我的代码。所有节点都插入到子节点的右边。
节点代表一个页面,我想检查每个页面,以检测用户是否是人类或垃圾邮件机器人。
每个页面可以链接到另外2个页面。一个人将遍历网页的方式,它将能够转到上一页或下两个页面之一,他们被链接到。否则,他们将被归类为垃圾邮件机器人。
我想实现的代码
package stringBtree;
public class StringBinaryTreeSample {
public static void main(String[] args)
{
new StringBinaryTreeSample().run();
}
static class Node
{
Node left;
Node right;
char value;
public Node(char value) {
this.value = value;
}
}
public void run() {
Node rootnode = new Node('A');
System.out.println("Building tree with rootvalue " + rootnode.value);
System.out.println("=================================");
insert(rootnode, 'b' );
insert(rootnode, 'd' );
insert(rootnode, 'c');
insert(rootnode, 'd');
insert(rootnode, 'e' );
insert(rootnode, 'f');
insert(rootnode, 'g');
insert(rootnode, 'h');
insert(rootnode, 'i');
insert(rootnode, 'j');
insert(rootnode, 'k');
insert(rootnode, 'l');
insert(rootnode, 'm');
insert(rootnode, 'n');
insert(rootnode, 'o');
insert(rootnode, 'p');
insert(rootnode, 'q');
System.out.println("\n\nTraversing tree in order");
System.out.println("=================================");
printInOrder(rootnode);
}
public void insert(Node node, char value) {
if (value < node.value) {
if (node.left != null) {
insert(node.left, value);
} else {
System.out.println(" Inserted " + value + " to left of node " + node.value);
node.left = new Node(value);
}
} else if (value > node.value) {
if (node.right != null) {
insert(node.right, value);
} else {
System.out.println(" Inserted " + value + " to right of node " + node.value);
node.right = new Node(value);
}
}
}
public void printInOrder(Node node) {
if (node != null) {
printInOrder(node.left);
System.out.println(" Traversed " + node.value);
printInOrder(node.right);
}
}
}
字符串
2条答案
按热度按时间yftpprvb1#
如何比较字符串和字符串
首先,我应该说
char
不是string
。(和许多其他语言),char
实际上是一个2byte
的数字。看看字符的this ASCII table,你会发现每个字符都有一个唯一的字节对应。因为byte
可以被认为是一个数字,*你实际上可以使用常用的比较操作符>、<和==来比较字符。 另一方面,字符串是对象,所以你必须使用compareTo
方法来比较它们。**通过阅读有关字符串的文档,你可以发现compareTo方法将返回一个负数或正数,这取决于该字符串是在你正在比较的另一个字符串之前还是之后(点击链接阅读文档以获得更多信息)。为什么节点总是添加到右侧
我假设你是说你插入到树中的节点总是添加到根节点的右边。你代码中的根节点是字符
A
,根据ASCII表,实际上小于你后面添加的所有其他字符,因为所有其他字母都是。所以这意味着下面的所有节点都将被添加到A
的右边。我不确定这是否是你想要的,但值得指出。如果你说节点总是被添加到整个树的右边,(所以它看起来像一条没有分支的长线),这是因为你挑选的字母和你把它们添加到树中的顺序。如果你遵循你的代码,你把'B'加到'A'.'B' > 'A'上,这样它就加到右边了。接下来你把'd '.'d' > 'B'加到右边了。然后你把' c '加上,'c' < 'd',所以节点应该在左边。之后,你按字母顺序添加节点,所以你添加的每个后续字母都大于你添加的最后一个字母。为了说明,'d' < 'e' < 'f' < 'g' <...< 'q'。因此,'c'之后的所有节点都添加到右边。这是有道理的;相反,你链接到的照片中的树是没有意义的。这棵树是一棵二叉树,在这个意义上,每个节点只有两个孩子,但是孩子节点并不“小于”或“大于”他们的父节点。我的意思是,为什么“B”小于“A”,同时“C”大于“A”?我不明白你会用那棵树做什么,除非这些字母的意思不是它们的字面字符。
如何让你的树看起来像一个在图片
如果你真的想让你的树看起来像图中的那样,你必须给字符分配数字,使得'B'小于'A','C'大于'A',等等。你可以使用数字而不是字符来比较这些字符。这可以通过创建一个带有字符字段和数字字段的类来实现。你可以然后将数字字段设置为任何你想要的数字,以使你的树看起来像你需要的样子。例如,'A'可以是50,'B' 49,'C' 51,等等。
nwlqm0z12#
下面是一个带字符串的B-Tree的概要实现:
字符串
}//close
型
}//close
这将为您的实际实现提供给予。