我理解整数上的二进制搜索树,因为我知道左边的子节点必须小于节点,右边的子节点必须大于节点,当涉及“char”或“string”类型时,它完全不同在这种情况下,我们不能说('a'<'b')或任何其他逻辑操作。 我如何比较char值?!
这是我的二叉树http://share.pho.to/89JtW我无法工作,因为每次我插入我的代码。所有节点都插入到子节点的右边。
节点代表页面,我想检查每个页面以检测用户是人还是spambot。
每个页面可以链接到另外2个页面。一个人会穿越 网页的方式是它能够转到上一页或它们链接到的下两页之一。否则,它们将被归类为spambot。
这个代码我试图实现
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);
}
}
}
答案 0 :(得分:0)
如何比较字符和字符串
首先,我应该说char
不是string
。在Java(和许多其他语言)中,char
实际上是两个byte
数字。看看this ASCII table个字符,你会发现每个字符都有一个唯一的字节对应物。由于byte
可以被认为是一个数字,你实际上可以使用通常的比较运算符&gt;,&lt;和==。 字符串来比较字符,另一方面hand,是对象,因此您必须使用compareTo
方法对它们进行比较。通过阅读有关字符串的文档,您可以发现compareTo方法将返回负数或正数取决于字符串是否按字母顺序排列在另一个字符串之前或之后,您将其与之比较(单击链接以阅读文档以获取更多信息)。
为什么节点总是被添加到右侧
我假设您说您插入树中的节点始终添加到根节点的右侧。代码中的根节点是字符A
,根据ASCII表,它实际上小于您稍后添加的所有其他字符,因为所有其他字母都是小写的。这意味着所有以下节点都将添加到A
的右侧。我不确定这是不是你想要的,但值得指出。
如果你说节点总是被添加到整个树的右边(这样它看起来像一条没有分支的长行),那是因为你选择的字母和你把它们添加到树的顺序。如果您按照代码操作,则将“b”添加到“A”。 'b'&gt; 'A'所以它被添加到右边。接下来添加'd'。 'd'&gt; 'b',以便将节点添加到右侧。然后你添加'c'和'c'&lt; 'd',所以节点应该在左边。之后,您按字母顺序添加节点,因此您添加的每个后续字母都大于您添加的最后一个字母。为了说明,'d'&lt; 'e'&lt; 'f'&lt; 'g'&lt; ......&lt; 'Q'。因此,'c'之后的所有节点都被添加到右侧。这是有道理的;相反,你链接的照片中的树没有意义。在每个节点只有两个子节点的意义上,该树是二叉树,但子节点不比其父节点“更少”或“更大”。我的意思是,'B'如何小于'A'并且'C'同时大于'A'?我不知道你会使用那棵树,除非这些字母的意思不是他们的字面字符。
如何使您的树看起来像图片中的
如果你真的想让你的树看起来像图片中的那个,你必须为字符分配数字,以便'B'小于'A','C'大于'A',然后在insert
方法中,您将使用数字而不是字符来比较这些字符。这可以通过创建一个带有字符字段和数字字段的类来完成。然后,您可以将数字字段设置为您希望使树看起来像您需要的任何内容。例如,'A'可以是50,'B'49,'C'51等等。
答案 1 :(得分:0)
下面是带字符串的B-Tree的概要实现:
public class TreeNode {
protected String nodeValue;
protected TreeNode leftChild;
protected TreeNode rightChild;
public TreeNode(String nodeValue){
this.nodeValue=nodeValue;
}//constructor closing
public void addChild(String childNodeValue){
if(childNodeValue.compareTo(nodeValue)<0){//go left
if(leftChild==null)leftChild=new TreeNode(childNodeValue);
else {
if(childNodeValue.compareTo(leftChild.getNodeValue())<0)leftChild.addChild(childNodeValue);
else{
TreeNode tempChild=new TreeNode(childNodeValue);
tempChild.setLeftChild(this.leftChild);
this.leftChild=tempChild;
}//else closing
}//else closing
}//if closing
else if(childNodeValue.compareTo(nodeValue)>0){//go right
if(rightChild==null)rightChild=new TreeNode(childNodeValue);
else {
if(childNodeValue.compareTo(rightChild.getNodeValue())>0)rightChild.addChild(childNodeValue);
else{
TreeNode tempChild=new TreeNode(childNodeValue);
tempChild.setRightChild(this.rightChild);
this.rightChild=tempChild;
}//else closing
}//else closing
}//if closing
else throw new RuntimeException("Problem");
}//addChild closing
public String getNodeValue(){return nodeValue;}
public TreeNode getLeftChild(){return leftChild;}
public TreeNode getRightChild(){return rightChild;}
public void setLeftChild(TreeNode leftChild){this.leftChild=leftChild;}
public void setRightChild(TreeNode rightChild){this.rightChild=rightChild;}
@Override
public String toString() {
String retVal="--"+nodeValue+"--\n";
return retVal;
}//toString closing
} //关闭课程
public class BTree {
protected TreeNode primaryNode;
public BTree(String primaryNodeValue){
primaryNode=new TreeNode(primaryNodeValue);
}//constructor closing
public void addChild(String childNodeValue){
primaryNode.addChild(childNodeValue);
}//addChild closing
public TreeNode getPrimayNode(){return primaryNode;}
@Override
public String toString() {
return primaryNode.toString();
}//toString closing
public static void main(String[] args) {
String midValue="m";
BTree tree=new BTree(midValue);
tree.addChild("a");
tree.addChild("b");
tree.addChild("y");
tree.addChild("z");
TreeNode mNode=tree.getPrimayNode();
TreeNode leftOfMNode=mNode.getLeftChild();
TreeNode rightOfMNode=mNode.getRightChild();
System.out.print(mNode);
System.out.print(leftOfMNode);
System.out.print(rightOfMNode);
System.out.println("---------------------------------------------------------------");
TreeNode bNode=leftOfMNode;
System.out.print(bNode);
System.out.print(bNode.getLeftChild());
System.out.print(bNode.getRightChild());
System.out.println("---------------------------------------------------------------");
TreeNode yNode=rightOfMNode;
System.out.print(yNode);
System.out.print(yNode.getLeftChild());
System.out.print(yNode.getRightChild());
}//main closing
} //关闭课程
这可以让您在实际实施方面领先一步。