zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
  • 相关阅读:
    Go语言和ASP.NET的一般处理程序在处理WEB请求时的速度比较
    XAML中特殊符号书写
    Sqlite执行insert or ignore 或insert or replace语句。
    对于项目编译时自动使用代码混淆的方法。
    Windows服务安装与控制
    PostgreSQL数据库中获取表主键名称
    开源框架
    RT/Metro商店应用如何调用SQLite数据库
    RT/Metro商店应用如何如何获取图片的宽高
    android中PreferenceScreen类的用法
  • 原文地址:https://www.cnblogs.com/happinessqi/p/3563951.html
Copyright © 2011-2022 走看看