• 常用的数据结构(二叉树)


    二叉树:就是弄一个对象,对象里边最少放着三个数据,分别是左子树,右子树和被存储的数据,然后左子树和右子树又是该对象类型,所以每一个左子树和右子树下面又是左子树,右子树和数据,这样就形成了一个倒着的树,不断的扩大,里边用的比较多就是递归。

    1.java实现

    package com.sjx.test1;
    
    import java.util.Scanner;
    class CBTType
    {
        String data;
        CBTType left;
        CBTType right;
    }
    
    
    public class BinaryTree {
        static int MAXLEN=20;
        static Scanner input=new Scanner(System.in);
        CBTType InitTree()
        {
            CBTType node;
            if((node=new CBTType())!=null)
            {
                System.out.printf("请先输入一个根结点数据:
    ");
                node.data=input.next();
                node.left=null;
                node.right=null;
                if(node!=null)
                {
                    return node;
                }
                else
                {
                    return null;
                }
            }
            return null;
        }
        
        CBTType TreeFindNode(CBTType treeNode, String data)
        {
            CBTType ptr;
            if(treeNode==null)
            {
                return null;
            }
            else
            {
                if(treeNode.data.equals(data))
                {
                    return treeNode;
                }
                else
                {
                    if((ptr=TreeFindNode(treeNode.left, data))!=null)
                    {
                        return ptr;
                    }
                    else if((ptr=TreeFindNode(treeNode.right, data))!=null)
                    {
                        return ptr;
                    }
                    else
                    {
                        return null;
                    }
                }
            }
        }
        
        void AddTreeNode(CBTType treeNode)
        {
            CBTType pnode, parent;
            String data;
            int menusel;
            
            if((pnode=new CBTType())!=null)
            {
                System.out.print("输入二叉树结点数据:
    ");
                
                pnode.data=input.next();
                pnode.left=null;
                pnode.right=null;
                
                System.out.print("输入该节点的父节点数据:");
                data=input.next();
                
                parent=TreeFindNode(treeNode, data);    //查找指定数据的结点
                if(parent==null)
                {
                    System.out.printf("未找到该父结点!
    ");
                    pnode=null;
                    return;
                }
                do
                {
                    menusel=input.nextInt();
                    if(menusel==1||menusel==2)
                    {
                        if(parent==null)
                        {
                            System.out.printf("不存在父结点,请先设置父结点!
    ");
                        }
                        
                    else
                    {
                        switch(menusel)
                        {
                        case 1:
                            if(parent.left!=null)
                            {
                                System.out.printf("左子树结点不为空!
    ");
                            }
                            else
                            {
                                parent.left=pnode;
                            }
                            break;
                        case 2:
                            if(parent.right!=null)
                            {
                                System.out.printf("右子树结点不为空!
    ");
                            }
                            else
                            {
                                parent.right=pnode;
                            }
                            break;
                        default:
                                System.out.printf("无效参数!
    ");
                        }
                    }
                }
            }while(menusel!=1&&menusel!=2);
        }
    }
        
        CBTType TreeLeftNode(CBTType treeNode)
        {
            if(treeNode!=null)
            {
                return treeNode.left;
            }
            else
            {
                return null;
            }
        }
        
        CBTType TreeRightNode(CBTType treeNode)
        {
            if(treeNode!=null)
            {
                return treeNode.right;
            }
            else
            {
                return null;
            }
        }
        
        
        int TreeEmpty(CBTType treeNode)
        {
            if(treeNode!=null)
            {
                return 0;
            }
            else
            {
                return 1;
            }
        }
        
        int TreeDepth(CBTType treeNode)
        {
            int depleft, depright;
            if(treeNode==null)
            {
                return 0; //空数,深度为0
            }
            else
            {
                depleft=TreeDepth(treeNode.left);
                depright=TreeDepth(treeNode.right);
                if(depleft>depright){
                    return depleft+1;
                }
                else
                {
                    return depright+1;
                }                
            }
        }
        
        void ClearTree(CBTType treeNode)
        {
            if(treeNode!=null)
            {
                ClearTree(treeNode.left);
                ClearTree(treeNode.right);
                treeNode=null;
            }
        }
        
        void TreeNodeData(CBTType p)
        {
            System.out.printf("%s", p.data);
        }
        
        void LevelTree(CBTType treeNode)
        {
            CBTType p;
            CBTType[] q=new CBTType[MAXLEN];
            int head=0, tail=0;
            
            if(treeNode!=null)
            {
                tail=(tail+1)%MAXLEN;
                q[tail]=treeNode;
            }
            while(head!=tail)
            {
                head=(head+1)%MAXLEN;
                p=q[head];
                TreeNodeData(p);
                if(p.left!=null)
                {
                    tail=(tail+1)%MAXLEN;
                    q[tail]=p.left;
                }
                
                if(p.right!=null)
                {
                    tail=(tail+1)%MAXLEN;
                    q[tail]=p.right;
                }
            }
        }
        
        void DLRTree(CBTType treeNode)    //先序遍历
        {
            if(treeNode!=null)
            {
                TreeNodeData(treeNode);
                DLRTree(treeNode.left);
                DLRTree(treeNode.right);
            }
        }
        
        void LDRTree(CBTType treeNode)    //中序遍历
        {
            if(treeNode!=null)
            {
                LDRTree(treeNode.left);
                TreeNodeData(treeNode);
                LDRTree(treeNode.right);
            }
        }
        
        void LRDTree(CBTType treeNode)    //后序遍历
        {
            if(treeNode!=null)
            {
                LRDTree(treeNode.left);
                LRDTree(treeNode.right);
                TreeNodeData(treeNode);
            }
        }
        
        public static void main(String[] args)
        {
            CBTType root=null;
            int menusel;
            BinaryTree t=new BinaryTree();
            root=t.InitTree();
            
            do
            {
                System.out.printf("请选择菜单添加二叉树的结点
    ");
                System.out.printf("0.推出	");
                System.out.printf("1.添加二叉树的结点
    ");
                menusel=input.nextInt();
                switch(menusel)
                {
                case 1:
                    t.AddTreeNode(root);
                    break;
                case 0:
                    break;
                default:
                        ;
                }
            }while(menusel!=0);
        do
        {
            System.out.printf("请选择菜单遍历二叉树,输入0便是退出:
    ");
            System.out.printf("1.先序遍历DLR	"); //显示菜单
            System.out.printf("2.中序遍历LDR
    ");
            System.out.printf("3.后序遍历LRD	");
            System.out.printf("4.按层遍历
    ");
            menusel=input.nextInt();
            switch(menusel)
            {
            case 0:
                break;
            case 1:
                System.out.printf("先序遍历DLR的结果: ");
                t.DLRTree(root);
                System.out.printf("
    ");
                break;
            case 2:
                System.out.printf("中序遍历LDR的结果: ");
                t.DLRTree(root);
                System.out.printf("
    ");
                break;
            case 3:
                System.out.printf("后序遍历LRD的结果: ");
                t.DLRTree(root);
                System.out.printf("
    ");
                break;
            case 4:
                System.out.printf("按层遍历的结果: ");
                t.DLRTree(root);
                System.out.printf("
    ");
                break;
            default:
                    ;
            }
        }while(menusel!=0);
        System.out.printf("
    二叉树深度是: %d
    ", t.TreeDepth(root));
        
        t.ClearTree(root);    //清空二叉树
        root=null;
        }
    }
  • 相关阅读:
    Spring Security
    用过sessionid防钓鱼
    request获取json
    相对于Statement,PreparedStatement的优点是什么?
    jquery中$.get()提交和$.post()提交有区别吗?
    相对于Statement,PreparedStatement的优点是什么?
    什么是Redis?
    如何解决表单提交的中文乱码问题
    execute,executeQuery,executeUpdate的区别是什么?
    根据你以往的经验简单叙述一下MYSQL的优化
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5968807.html
Copyright © 2020-2023  润新知