zoukankan      html  css  js  c++  java
  • 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);
        }
        
    }
  • 相关阅读:
    【LeetCode】1248. 统计「优美子数组」
    【LeetCode】200. 岛屿数量
    【LeetCode】53. 最大子序和
    【剑指Offer】面试题42. 连续子数组的最大和
    【剑指Offer】面试题57. 和为s的两个数字
    【LeetCode】55. 跳跃游戏
    【LeetCode】56. 合并区间
    简历HTML网页版
    关于新建Eclipse新建一个WEB项目后创建一个jsp文件头部报错问题?
    jquery选择器 看这个链接吧!2017.6.2
  • 原文地址:https://www.cnblogs.com/amos-s/p/6536356.html
Copyright © 2011-2022 走看看