• BiTree


    package ch11;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Stack;
    
    public class LinkBinTree <T>{
    
        public static class TreeNode
        {
            Object data;
            TreeNode left;
            TreeNode right;
            public TreeNode()
            {
                
            }
            public TreeNode(Object data)
            {
                this.data = data;
                left = null;
                right = null;
            }
            public TreeNode(Object data,TreeNode left,TreeNode right)
            {
                this.data = data;
                this.left = left;
                this.right = right;
            }
        }
        private TreeNode root;
        public LinkBinTree()
        {
            this.root = new TreeNode();
        }
        //以指定根元素创建二叉树
        public LinkBinTree(T data)
        {
            this.root = new TreeNode(data);
        }
        //为指定节点添加子节点
        public TreeNode addNode(TreeNode parent, T data,boolean isLeft)
        {
            if(parent == null)
                throw new RuntimeException("节点为null,无法添加子节点");
            if(isLeft && parent.left != null)
                throw new RuntimeException(parent+"节点已经有左子节点,无法添加左子节点");
            if(!isLeft && parent.right!=null)
                throw new RuntimeException(parent+"节点已经有右子节点,无法添加右子节点");
            TreeNode newNode = new TreeNode(data);
            if(isLeft)
                parent.left = newNode;
            else
                parent.right  = newNode;
            return newNode;
        }
        //判空
        public boolean empty()
        {
            return root.data ==null;
        }
        //返回固定节点的左子节点
        public T leftChild(TreeNode parent)
        {
            if(parent ==null)
                throw new RuntimeException("节点为Null,没有子节点");
            return parent.left == null?null:(T)parent.left.data;
        }
        public T rightChild(TreeNode parent)
        {
            if(parent ==null)
                throw new RuntimeException("节点为Null,没有子节点");
            return parent.right == null?null:(T)parent.right.data;
        }
        
        public TreeNode root()
        {
            if(empty())
                throw new RuntimeException("树为空,无法访问根节点");
            return root;
        }
        public T parent(TreeNode node)
        {
            return null;
        }
        //递归,每棵子树的额深度为其所有子树的最大深度+1
        public int deep(TreeNode node)
        {
            if(node == null)
                return 0;
            else{
                int leftDeep = deep(node.left);
                int rightDeep  = deep(node.right);
                int max = leftDeep>rightDeep?leftDeep:rightDeep;
                return max+1;
            }
        }
        
        //先序遍历二叉树
        public List<TreeNode> preIterator()
        {
            return preIterator(root);
        }
        public List<TreeNode> preIterator(TreeNode node)
        {
            List<TreeNode> list = new ArrayList<TreeNode>();
            //处理根节点
            list.add(node);
            if(node.left!=null)
                list.addAll(preIterator(node.left));
            if(node.right!=null)
                list.addAll(preIterator(node.right));
            return list;
        }
        
        //中序遍历
        public List<TreeNode> inIteratror()
        {
            return inIterator(root);
        }
        private List<TreeNode> inIterator(TreeNode node)
        {
            List<TreeNode> list = new ArrayList<TreeNode>();
            if(node.left!= null)
                list.addAll(inIterator(node.left));
            list.add(node);
            if(node.right!=null)
                list.addAll(inIterator(node.right));
            return list;
        }
        //非递归先序遍历二叉树
        public List<TreeNode> nonCursivePreIterator(TreeNode node){
            Stack<TreeNode>stack = new Stack<TreeNode> ();
            List<TreeNode> list  = new ArrayList<TreeNode>();
            list.add(node);
            while(node!=null || !stack.empty())
            {
                while(node!=null)
                {
                    //System.out.println(node.data);
                    list.add(node);
                    stack.push(node);
                    node=node.left;
                }
                if(!stack.empty())
                {
                    node = stack.pop();
                    node = node.right;
                }
            }
            return list;
            
        }
    }
    package ch11;
    
    import java.util.List;
    
    import ch11.LinkBinTree.TreeNode;
    
    public class LinkBinTreeTest {
    
        public static void main(String[] args){
            LinkBinTree<String> binTree = new LinkBinTree<String>("根节点");
            TreeNode tn1= binTree.addNode(binTree.root(), "第二层左节点", true);
            TreeNode tn2 = binTree.addNode(binTree.root(), "第二层右节点", false);
            TreeNode tn3 = binTree.addNode(tn2,"第三层左节点", true);
            TreeNode tn4 = binTree.addNode(tn2,"第三层右节点",false);
            TreeNode tn5 = binTree.addNode(tn3, "第四层左节点", true);
            System.out.println("根节点是哪个?"+binTree.root().data);
            System.out.println("tn2的左子节点是: "+binTree.leftChild(tn2));
            System.out.println("tn2的右子节点是: "+binTree.rightChild(tn2));
            System.out.println(binTree.deep(binTree.root()));
            
            /*List<TreeNode> list = binTree.inIteratror();
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).data);
            }*/
            List<TreeNode> list  = binTree.nonCursivePreIterator(binTree.root());
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i).data);
            }
        }
    }
  • 相关阅读:
    java生成二维码
    关于使用QRcode.jar生成二维码
    sun.misc.BASE64Encoder找不到jar包的解决方法
    perl 调用方法 子例程说明
    perl 访问类方法的几种方式
    perl use base 代替 @ISA
    perl 为什么要用引用来做对象呢?
    12.5.3 UNIVERSAL:最终的祖先类:
    Informix9客户端工具Server Studio JE乱码的解决方法
    perl 使用SUPER类来访问覆盖的方法
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3563951.html
Copyright © 2020-2023  润新知