java 二叉搜索树使用char类型

gzszwxb4  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(105)

我理解整数上的二叉搜索树,因为我知道左边的孩子必须小于节点,而右边的孩子必须大于节点,当涉及到“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);
    }
  }
}

字符串

yftpprvb

yftpprvb1#

如何比较字符串和字符串

首先,我应该说char不是string。(和许多其他语言),char实际上是一个2 byte的数字。看看字符的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,等等。

nwlqm0z1

nwlqm0z12#

下面是一个带字符串的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

字符串
}//close

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


}//close
这将为您的实际实现提供给予。

相关问题