算法练习-树结构

来源:互联网 发布:sftp命令 端口 编辑:程序博客网 时间:2024/06/15 11:22
import java.util.Scanner;import org.omg.Messaging.SYNC_WITH_TRANSPORT;class CBTType{    String data;    CBTType left;    CBTType right;}public class shu {    static final int MAXLEN=20;    static Scanner sc=new Scanner(System.in);    CBTType InitTree(){// 初始化二叉树根        CBTType node;        if((node=new CBTType())!= null){            System.out.printf("请先输入一个根结点数据:\n");            node.data=sc.next();            node.left=null;            node.right=null;            if(node!=null){// 如果二叉树根结点不为空                return node;            }else{                return node;            }        }        return null;    }    public static void main(String[] args) {        CBTType root=null;// root为指向二叉树根结点的引用        int menusel;        shu t=new shu();        root=t.InitTree();        do{            System.out.printf("请选择菜单添加二叉树的结点");            System.out.println("0.退出");            System.out.println("1.添加二叉树的结点");            menusel=sc.nextInt();            switch (menusel) {            case 1:                t.AddTreeNode(root);                break;            case 0:                break;            default:                break;            }        }while(menusel !=0);        do{            System.out.printf("请选择菜单遍历二叉树,输入0表示退出:\n");            System.out.println("1.先序遍历DLR\t");            System.out.println("2.中序遍历LDR");            System.out.println("3.后序遍历LRD");            System.out.println("4.按层遍历\n");            menusel=sc.nextInt();            switch (menusel) {            case 0:                break;            case 1:                System.out.println("\n先序遍历DLR的结果");                t.DLRTree(root);                System.out.println();            case 2:                System.out.println("中序LDR遍历的结果:");                t.LDRTree(root);                System.out.println();            case 3:                System.out.println("后序遍历lrd的结果");                t.LDRTree(root);                System.out.println();            case 4:                System.out.println("按层遍历的结果");                t.LevelTree(root);                System.out.println();            default:                break;            }        }while(menusel!=0);        System.out.printf("二叉树的深度:%d",t.TreeDepth(root));        t.ClearTree(root);        root=null;    }    private void AddTreeNode(CBTType treeNode) {        CBTType pnode,parent;        String data;        int menusel;        if((pnode=new CBTType())!=null){            System.out.println("输入二叉树结点数据:");            pnode.data=sc.next();            pnode.left=null;            pnode.right=null;            System.out.print("输入该结点的父节点数据");            data=sc.next();            parent=TreeFindNode(treeNode,data);            if(parent==null){                System.out.print("未找到该结点父节点");                pnode=null;                return;            }            System.out.println("1.添加该结点 到左子树\n2.添加该结点到右子数\n");            do{                menusel=sc.nextInt();                if(menusel==1||menusel==2){                    if(parent==null){                        System.out.println("不存在父节点,请先设置父节点");                    }else{                        switch (menusel) {                        case 1:                            if(parent.left!=null){                                System.out.println("左子树结点不为空");                            }else{                                parent.left=pnode;                            }                            break;                        case 2:                            if(parent.right!=null){                                System.out.println("右子树结点不为空");                            }else{                                parent.right=pnode;                            }                            break;                        default:                            System.out.println("无效参数");                            break;                        }                    }                }            }while(menusel!=1&&menusel!=2);        }    }    private 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;                }            }        }    }    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 TreeIsEmpty(CBTType treeNode){        if(treeNode!=null){            return 0;        }else{            return 1;        }    }    int TreeDepth(CBTType treeNode){        int depleft,depright;        if(treeNode==null){            return 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);        }    }}

部分截图

这里写图片描述