Java 初始化二叉树,先序,中序,后序遍历,深度

来源:互联网 发布:北津学院教务网络管 编辑:程序博客网 时间:2024/06/06 15:41
import java.util.Scanner;//定义二叉树结点类型class CBTType {    String data;//元素数据    CBTType left;    CBTType right;}class Main {    static final int MAXLEN = 20;    static Scanner input = new Scanner(System.in);    CBTType InitTree() //初始化二叉树的根    {        CBTType node = null;        if ( (node = new CBTType()) != null )        {            System.out.printf("请先输入一个根结点数据: \n");            node.data = input.next();            node.left = null;            node.right = null;//          return node;        }        return node;    }    //添加结点    void AddTreeNode( CBTType treeNode )    {        CBTType pnode, parent;        String data;        int menuse1;        if ( (pnode = new CBTType()) != null )        {            System.out.printf("输入二叉树结点数据:\n");            pnode.data = input.next();            pnode.left = null;            pnode.right = null;            System.out.println("输入该结点的父节点数据:");            data = input.next();            parent = TreeFindNode(treeNode, data);            if (parent == null)            {                System.out.println("未找到该父节点!\n");                pnode = null;//释放创建的结点内容                return;            }            System.out.println("1.添加该结点到左子树");            System.out.println("2.添加该结点到右子树");            do {                menuse1 = input.nextInt();                if (menuse1 == 1 || menuse1 == 2)                {                    if (parent == null)                    {                        System.out.println("不存在父节点,请先设置父节点!");                    }                    else                    {                        switch(menuse1)                        {                        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("无效参数!");                        }                    }                }            } while (menuse1 != 1 & menuse1 != 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;    }    //判断是否为空    boolean TreeIsEmpty(CBTType treeNode)    {        if (treeNode != null)        {            return false;        }        else         {            return true;        }    }    //计算二叉树的的深度    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);    }    public static void main(String[] args)     {        CBTType root = null;        int menuse1;        Main t = new Main();        //设置根元素        root = t.InitTree();        //添加结点        do {            System.out.println("请选择菜单添加二叉树的结点\n");            System.out.println("0.退出\t");//显示菜单            System.out.println("1.添加二叉树的结点\n");            menuse1=input.nextInt();            switch( menuse1 )            {            case 1:                t.AddTreeNode(root);                break;            case 0: break;            default: break;            }        } while (menuse1 != 0);        //遍历        do {            System.out.println("请选择遍历二叉树,输入0表示退出: ");            System.out.println("1.先序遍历");            System.out.println("2.中序遍历");            System.out.println("3.后序遍历");            System.out.println("4.按层遍历");            menuse1 = input.nextInt();            switch( menuse1 )            {            case 0: break;            case 1: //                    System.out.println("先序遍历PreTraversalTree的结果是: ");                    t.PreTraversalTree(root);                    System.out.println();                    break;            case 2:                System.out.println("中序遍历的结果是;");                t.InTraversalTree(root);                System.out.println();                break;            case 3:                System.out.println("后序遍历的结果是: ");                t.PostTraversalTree(root);                System.out.println();                break;            case 4:                System.out.println("按层遍历的结果是: ");                t.LevelTraversalTree(root);                System.out.println();                break;            default:break;            }        }while ( menuse1 != 0 );        //深度        System.out.println("二叉树深度为: %d" + t.TreeDepth(root));        //清空二叉树        t.ClearTree(root);        root = null;    }    //层序遍历    private void LevelTraversalTree(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;            }        }    }    //后序遍历    private void PostTraversalTree(CBTType root) {        if ( root != null )        {            PostTraversalTree(root.left);            PostTraversalTree(root.right);            TreeNodeData(root);        }    }    //前序遍历    private void PreTraversalTree(CBTType root) {        if ( root != null )        {            TreeNodeData(root);            PreTraversalTree(root.left);            PreTraversalTree(root.right);        }    }    //中序遍历    private void InTraversalTree(CBTType root) {        if ( root != null )        {            InTraversalTree(root.left);            TreeNodeData(root);            InTraversalTree(root.right);        }    }}
阅读全文
0 0
原创粉丝点击