二叉树Java代码实现(Binary Tree)

二叉树:二叉树是一种树形结构,它的特点是一个结点至多有两棵子树,并且二叉树的子树有左右之分。

1. 二叉树的遍历

二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。

先序遍历:访问根节点、先序遍历左子树、先序遍历右子树。

中序遍历:中序遍历左子树、访问根节点、中序遍历右子树。

后序遍历:后续遍历左子树、后续遍历右子树、访问根节点。

先序遍历,访问根节点、先序遍历左子树、先序遍历右子树,如下图所示:

这样的一棵树,先序遍历结果:-+a*b-cd/ef;中序遍历结果:a+b*c-d-e/f;后序遍历结果:abcd-*+ef/-

2. 代码实现

代码实现如下所示。

package tree;

/**
 * 二叉树
 */

public class MyBinaryTree {
    private char data; // 结点的数据域
    private MyBinaryTree rightSubtree; // 右子树
    private MyBinaryTree leftSubtree; // 左子树

    public MyBinaryTree(char data) {
        this.data = data;
        this.leftSubtree = null;
        this.rightSubtree = null;
    }

    public void makeRightSubtree(char data) {
        this.rightSubtree = new MyBinaryTree(data);
    }

    public void makeLeftSubTree(char data) {
        this.leftSubtree = new MyBinaryTree(data);
    }

    public void makeSubtree(char leftData, char rightData) {
        this.leftSubtree = new MyBinaryTree(leftData);
        this.rightSubtree = new MyBinaryTree(rightData);
    }

    // 中序遍历
    public void inorderTraversal() {
        if (this.leftSubtree != null) {
            this.leftSubtree.inorderTraversal();
        }
        System.out.print("[" + this.data + "]");
        if (this.rightSubtree != null) {
            this.rightSubtree.inorderTraversal();
        }
    }

    // 先序遍历
    public void preOrderTraversal() {
        System.out.print("[" + this.data + "]");
        if (this.leftSubtree != null) {
            this.leftSubtree.preOrderTraversal();
        }
        if (this.rightSubtree != null) {
            this.rightSubtree.preOrderTraversal();
        }
    }

    // 后序遍历
    public void postOrderTraversal() {
        if (this.leftSubtree != null) {
            this.leftSubtree.postOrderTraversal();
        }
        if (this.rightSubtree != null) {
            this.rightSubtree.postOrderTraversal();
        }
        System.out.print("[" + this.data + "]");
    }

    public MyBinaryTree getRightSubtree() {
        return rightSubtree;
    }

    public MyBinaryTree getLeftSubtree() {
        return leftSubtree;
    }

    public static void main(String[] args) {
        MyBinaryTree root = new MyBinaryTree('-');
        root.makeLeftSubTree('+');
        root.makeRightSubtree('/');
        root.getLeftSubtree().makeLeftSubTree('a');
        root.getLeftSubtree().makeRightSubtree('*');
        root.getRightSubtree().makeLeftSubTree('e');
        root.getRightSubtree().makeRightSubtree('f');
        root.getLeftSubtree().getRightSubtree().makeSubtree('b', '-');
        root.getLeftSubtree().getRightSubtree().getRightSubtree().makeSubtree('c', 'd');

        System.out.print("前序遍历:");
        root.preOrderTraversal();
        System.out.print("\n中序遍历:");
        root.inorderTraversal();
        System.out.print("\n后序遍历:");
        root.postOrderTraversal();
    }
}

测试数据,构建下图的二叉树:

        MyBinaryTree root = new MyBinaryTree('-');
        root.makeLeftSubTree('+');
        root.makeRightSubtree('/');
        root.getLeftSubtree().makeLeftSubTree('a');
        root.getLeftSubtree().makeRightSubtree('*');
        root.getRightSubtree().makeLeftSubTree('e');
        root.getRightSubtree().makeRightSubtree('f');
        root.getLeftSubtree().getRightSubtree().makeSubtree('b', '-');
        root.getLeftSubtree().getRightSubtree().getRightSubtree().makeSubtree('c', 'd');

三种遍历方式进行遍历:

        System.out.print("前序遍历:");
        root.preOrderTraversal();
        System.out.print("\n中序遍历:");
        root.inorderTraversal();
        System.out.print("\n后序遍历:");
        root.postOrderTraversal();

运行截图如下所示:

参考文献

  • 数据结构 -  严蔚敏、吴伟民 -  清华大学出版社
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值