java二叉树实现代码

Posted 谜一样

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java二叉树实现代码相关的知识,希望对你有一定的参考价值。

public class Tree {
    
    private TreeNode root = null;
    public Tree() {
        root = new TreeNode(1, "A");
    }
    
    private class TreeNode {
        private int key;
        private String data;
        private boolean isVisted;
        private TreeNode leftChild;
        private TreeNode rightChild;
        
        public TreeNode(int key, String data) {
            this.key = key;
            this.data = data;
            this.leftChild = null;
            this.rightChild = null;
            this.isVisted = false;
        }
    }
    /**
     * 创建一颗二叉树
     *             A
     *         B        C
     *       D   E            F
     * createBinTree:(). 
     * @author 卫健
     * @param root
     */
    public void createBinTree(TreeNode root) {
        TreeNode newNodeB = new TreeNode(2, "B");
        TreeNode newNodeC = new TreeNode(3, "C");
        TreeNode newNodeD = new TreeNode(4, "D");
        TreeNode newNodeE = new TreeNode(5, "E");
        TreeNode newNodeF = new TreeNode(6, "F");
        root.leftChild = newNodeB;
        root.rightChild = newNodeC;
//        newNodeC.rightChild = newNodeF;
//        newNodeB.leftChild = newNodeD;
//        newNodeB.rightChild = newNodeE;
        root.rightChild.rightChild = newNodeF;
        root.leftChild.leftChild = newNodeD;
        root.leftChild.rightChild = newNodeE;
    }
    
    public boolean isEmpty() {
        return root == null;
    }
    //树的高度
    public int height() {
        return height(root);
    }
    //节点个数
    public int size() {
        return size(root);
    }
    
    private int height(TreeNode subTree) {
        if (subTree == null)
            return 0;
        
        int i = height(subTree.leftChild);
        int j = height(subTree.rightChild);
        
        return i < j ? j + 1 : i + 1;
    }
    
    private int size(TreeNode subTree) {
        if (subTree == null)
            return 0;
        return 1 + size(subTree.leftChild) + size(subTree.rightChild);
    }
    //返回双亲节点
    public TreeNode parent(TreeNode element) {
        return (root == null || root == element) 
                ? null : parent(root, element);
    }
    
    public TreeNode parent(TreeNode subTree, TreeNode element) {
        if (subTree == null)
            return null;
        if (subTree.leftChild == element || subTree.rightChild == element) {
            //返回父节点地址
            return subTree;
        }
        TreeNode p;
        //先在左子树中查找,如果左子树中没有找到,则到右子树中查找
        if ((p = parent(subTree.leftChild, element)) != null)
            return p; //递归左子树中搜索
        else
            return parent(subTree.rightChild, element);
    }
    
    public TreeNode getLeftChildNode(TreeNode element) {
        return element != null ? element.leftChild : null;
    }
    
    public TreeNode getRightChildNode(TreeNode element) {
        return element != null ? element.rightChild : null;
    }
    
    public TreeNode getRoot() {
        return root;
    }
    
    //在释放某个节点时,该节点的左右子树都已经释放,
    //所以应该采用后续遍历,当访问某个节点时将该节点的存储空间释放
    public void distroy(TreeNode subTree) {
        //删除根为subTree的子树
        if (subTree != null) {
            //删除左子树
            distroy(subTree.leftChild);
            //删除右子树
            distroy(subTree.rightChild);
            //删除根节点
            subTree = null;
        }
    }
    
    public void traverse(TreeNode subTree) {
        System.out.println("key:" + subTree.key + "--name:" + subTree.data);
        traverse(subTree.leftChild);
        traverse(subTree.rightChild);
    }
    //前序遍历
    public void perOrder(TreeNode subTree) {
        if (subTree != null) {
            visted(subTree);
            perOrder(subTree.leftChild);
            perOrder(subTree.rightChild);
        }
    }
    //中序遍历
    public void inOrder(TreeNode subTree) {
        if (subTree != null) {
            perOrder(subTree.leftChild);
            visted(subTree);
            perOrder(subTree.rightChild);
        }
    }
    //后序遍历
    public void postOrder(TreeNode subTree) {
        if (subTree != null) {
            perOrder(subTree.leftChild);
            perOrder(subTree.rightChild);
            visted(subTree);
        }
    }
    //将二叉树镜面对称
    public void mirror(TreeNode subTree) {
        if (subTree == null)
            return;
        TreeNode node = new TreeNode(subTree.key, subTree.data);
        node.leftChild = subTree.leftChild;
        subTree.leftChild = subTree.rightChild;
        subTree.rightChild = node.leftChild;
        mirror(subTree.leftChild);
        mirror(subTree.rightChild);
    }
    
    public void visted(TreeNode subTree) {
        subTree.isVisted = true;
        System.out.println("key:" + subTree.key + "---data:" + subTree.data);
    }
    //测试
    public static void main(String[] args) {
        Tree bt = new Tree();
        bt.createBinTree(bt.root);
        
        System.out.println(bt.size() + "---size");
        System.out.println(bt.height() + "---height");
        
        System.out.println("**************前序遍历************");
        bt.perOrder(bt.root);
        System.out.println("************镜面对称**前序遍历************");
        bt.mirror(bt.root);
        bt.perOrder(bt.root);
//        System.out.println("**************中序遍历************");
//        bt.inOrder(bt.root);
//        
//        System.out.println("**************后序遍历************");
//        bt.postOrder(bt.root);
    }
    
}

 

以上是关于java二叉树实现代码的主要内容,如果未能解决你的问题,请参考以下文章

数据结构二叉树相关面试题 Java版 LeetCode题 ------- 二叉树

java实现线索化二叉树的前序中序后续的遍历(完整代码)

[DataStructure]哈希表二叉树及多叉树 Java 代码实现

堆排Java代码实现

华为OD机试真题Java实现数组二叉树真题+解题思路+代码(2022&2023)

java实现二叉树的构建以及3种遍历方法(转)