【问题标题】:Binary search tree implementation in java with traversaljava中带遍历的二叉搜索树实现
【发布时间】:2015-06-23 14:20:09
【问题描述】:

我已经实现了一个带有插入和遍历方法的二叉搜索树,但是没有得到 PreOrder 和 Postorder 的正确输出,我得到 inOrder 的正确顺序。谁能告诉我哪里错了。

我在纸上尝试了相同的示例,但 PreOrder 和 PostOrder 不一样。

这是我的代码

节点类

package com.BSTTest;

public class Node implements Comparable<Node> {
    private int data;
    private Node leftChild;
    private Node rightChild;

    public Node(int data) {
        this(data, null, null);
    }

    public Node(int data, Node leftChild, Node rightChild) {
        this.data = data;
        this.leftChild = leftChild;
        this.rightChild = rightChild;

    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public Node getLeftChild() {
        return leftChild;
    }

    public void setLeftChild(Node leftChild) {
        this.leftChild = leftChild;
    }

    public Node getRightChild() {
        return rightChild;
    }

    public void setRightChild(Node rightChild) {
        this.rightChild = rightChild;
    }

    public int compareTo(Node o) {
        return Integer.compare(this.data, o.getData());
    }
}

树类

package com.BSTTest;

import com.BSTTest.Node;

public class Tree {
    private Node root = null;

    public Node getRoot() {
        return root;
    }
     //Inserting data**strong text**
    public void insertData(int data) {
        Node node = new Node(data, null, null);
        if (root == null) {
            root = node;
        } else {
            insert(node, root);
        }
    }
    //Helper method for insert
    private void insert(Node node, Node currNode) {
        if (node.compareTo(currNode) < 0) {
            if (currNode.getLeftChild() == null) {
                currNode.setLeftChild(node);
            } else {
                insert(node, currNode.getLeftChild());
            }
        } else {

            if (currNode.getRightChild() == null) {
                currNode.setRightChild(node);
            } else {
                insert(node, currNode.getRightChild());
            }
        }
    }

    public void printInorder() {
        printInOrderRec(root);
        System.out.println("");
    }


      //Helper method to recursively print the contents in an inorder way

    private void printInOrderRec(Node currRoot) {
        if (currRoot == null) {
            return;
        }
        printInOrderRec(currRoot.getLeftChild());
        System.out.print(currRoot.getData() + ", ");
        printInOrderRec(currRoot.getRightChild());
    }

    public void printPreorder() {
        printPreOrderRec(root);
        System.out.println("");
    }


     // Helper method for PreOrder Traversal recursively 

    private void printPreOrderRec(Node currRoot) {
        if (currRoot == null) {
            return;
        }
        System.out.print(currRoot.getData() + ", ");
        printPreOrderRec(currRoot.getLeftChild());
        printPreOrderRec(currRoot.getRightChild());
    }

    public void printPostorder() {
        printPostOrderRec(root);
        System.out.println("");
    }

    /**
     * Helper method for PostOrder method to recursively print the content
     */
    private void printPostOrderRec(Node currRoot) {
        if (currRoot == null) {
            return;
        }
        printPostOrderRec(currRoot.getLeftChild());
        printPostOrderRec(currRoot.getRightChild());
        System.out.print(currRoot.getData() + ", ");
    }
    //Main Mthod
    public static void main(String[] args) {
        Tree obj = new Tree();
        //Inserting data
        obj.insertData(3);
        obj.insertData(5);
        obj.insertData(6);
        obj.insertData(2);
        obj.insertData(4);
        obj.insertData(1);
        obj.insertData(0);

        //printing content in Inorder way
        System.out.println("Inorder traversal");
        obj.printInorder();

        //printing content in Inorder way
        System.out.println("Preorder Traversal");
        obj.printPreorder();

        //printing content in Inorder way
        System.out.println("Postorder Traversal");
        obj.printPostorder();
    }
}

【问题讨论】:

  • 你能告诉我们它打印的是什么吗??
  • 目前输出为中序遍历 0, 1, 2, 3, 4, 5, 6, 前序遍历 3, 2, 1, 0, 5, 4, 6, 后序遍历 0, 1、2、4、6、5、3,
  • @Raj 正确的输出是什么?
  • @EvanBechtol 预期 O/P : PreOrder : 3,1,0,2,5,4,6, PostOrder : 0,2,1,4,6,5,3 获得 O/P : PreOrder : 3,2,1,0,5,4,6, PostOrder: 0,1,2,4,6,5,3 –
  • @Raj 输出是正确的前序和后序遍历。 (en.wikipedia.org/wiki/Tree_traversal)。您应该重新检查您对预购、后购的定义

标签: java algorithm data-structures binary-search-tree


【解决方案1】:

看我的朋友,你的代码绝对没问题,因为你提到的输出是绝对正确的。

我认为你没有正确理解二叉搜索树的概念。

你是对的,3 是根节点,但你说 1 是它的左孩子是错误的。

出现在 3 之后且小于 3 的第一个值是 2,因此 2 是 3 的左孩子而不是 1

如果仍有困惑,请参阅 Cormenn 的书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2011-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多