二叉树的创建与遍历

怎甘沉沦 提交于 2020-03-21 00:18:04

 

     此时有这样一棵树,其先序遍历:ABCDEFGH;中序遍历:CBEDFAGH;后序遍历:CEFDBHGA;想要以输入结点的方式来创建树。可以考虑一个节点创建成功在创建其左右结点,若其左右结点为空,则返回至上一个结点继续创建,直到创建完毕。

创建树的结点:

class BNode{
    private BNode leftChild;
    private BNode rightChild;
    private char data;
    public BNode() {
    }
    public BNode(char data){
        this.data = data;
    }
    public BNode(BNode leftChild,BNode rightChild,char data){
        this.leftChild = leftChild;
        this.rightChild = rightChild;
        this.data = data;
    }
    public BNode getLeftChild() {
        return leftChild;
    }

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

    public BNode getRightChild() {
        return rightChild;
    }

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

    public char getData() {
        return data;
    }

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

创建树以及遍历树:

class BTree{
    private BNode root ;
    private int i  ;
    private String str;   //输入字符串
    private Scanner scanner;
    public BTree(){
        this.root = null;
        this.i = 0;
        this.str = null;
        this.scanner = new Scanner(System.in);
    }

    public void PreOrder() {   //先序遍历
        System.out.println("前序遍历: ");
        PreOrder(root);
        System.out.println();
    }

    private void PreOrder(BNode root) {
        if(root != null){
            System.out.print(root.getData()+" ");
            PreOrder(root.getLeftChild());
            PreOrder(root.getRightChild());
        }
    }

    public void InOrder() {    //中序遍历
        System.out.println("中序遍历: ");
        InOrder(root);
        System.out.println();
    }

    private void InOrder(BNode root) {
        if(root != null){
            InOrder(root.getLeftChild());
            System.out.print(root.getData()+" ");
            InOrder(root.getRightChild());
        }
    }

    public void PastOrder() {   //后序遍历
        System.out.println("后序遍历: ");
        PastOrder(root);
        System.out.println();
    }

    private void PastOrder(BNode root) {
        if(root != null){
            PastOrder(root.getLeftChild());
            PastOrder(root.getRightChild());
            System.out.print(root.getData()+" ");
        }
    }

    public void CreatTree(){  //创建树  (根据先序遍历顺序创建)
         root = CreatTreeA();
    }
    private void add(){
        i +=1;
    }
    public void SysIn(){
        str = scanner.next();
    }
    private BNode CreatTreeA(){
        char a ;
        BNode root = null;
        //1.读入元素
        a = str.charAt(i);
        add();
        //如果不等于'#',创建该节点,并且创建其左右孩子
        if (a != '#') {
            root = new BNode(a);
            root.setLeftChild(CreatTreeA());
            root.setRightChild(CreatTreeA());
        }
        // 否则,return root。
        return root;

    }

}
public class BinaryTreeDemo {
    public static void main(String[] args) {
        BTree bTree = new BTree();
        System.out.println("请输入创建树的节点:");
        bTree.SysIn();     //输入ABC##DE##F##G#H##
        bTree.CreatTree();   //创建树
        //遍历
        bTree.PreOrder();
        bTree.InOrder();
        bTree.PastOrder();
    }
}

         其中#表示root节点的左右孩子。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!