Java实现二叉树

来源:互联网 发布:matlab solve 数组 编辑:程序博客网 时间:2024/06/11 22:39

二叉树的链式存储结构包含节点元素及分别指向左右子树的引用。具体代码如下:

package binarytree;import java.util.Scanner;/** * 二叉树的节点 * @author liyong * */class BinaryTreeNode{    String data;    BinaryTreeNode left;    BinaryTreeNode right;}public class BinaryTreeOperation {    static final int MAXLEN = 20;    static Scanner input = new Scanner(System.in);    /**     * 初始化二叉树的根     * @return     */    public BinaryTreeNode initTree(){        BinaryTreeNode node;        if((node = new BinaryTreeNode())!= null){            System.out.printf("请先输入一个根节点数据:");            node.data = input.next();            node.left = null;            node.right = null;            if(node!=null){                return node;            }        }        return null;    }    /**     * 根据节点的值查找节点     * @param node     * @param data     * @return     */    public BinaryTreeNode findNodeByData(BinaryTreeNode node,String data){        BinaryTreeNode ptr;        if(node == null){            return null;        }else{            if(node.data.equals(data)){                return node;            }else{                if((ptr = findNodeByData(node.left, data))!=null){                    return ptr;                }else if((ptr = findNodeByData(node.right, data))!= null){                    return ptr;                }else{                    return null;                }            }        }    }    /**     * 向二叉树中添加节点,添加节点时需要知道该节点的父节点的值,根据     * 父节点的值查找到该父节点,然后判断该父节点的左右子树是否为空     * @param treeNode     */    public void addTreeNode(BinaryTreeNode treeNode){        BinaryTreeNode pnode,parent;        String data;        int menusel;        if((pnode = new BinaryTreeNode())!=null){            System.out.printf("输入二叉树节点数据:\n");            pnode.data = input.next();            pnode.left = null;            pnode.right = null;            System.out.printf("输入父节点的数据:");            data = input.next();            parent = findNodeByData(treeNode, data);            if(parent == null){                System.out.println("未找到该父节点");                pnode = null;                return;            }            System.out.printf("1、添加该节点到左子树,2、添加该节点到右子树\n");            do{                menusel = input.nextInt();                if(menusel == 1 || menusel == 2){                    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("无效参数");                    }                }            }while(menusel==1&&menusel==2);        }    }    /**     * 返货某个节点的左子树     * @param treeNode     * @return     */    public BinaryTreeNode getLeftNode(BinaryTreeNode treeNode){        if(treeNode != null){            return treeNode.left;        }else{            return null;        }    }    /**     * 返回某个节点的右子树     * @param treeNode     * @return     */    public BinaryTreeNode getRightNode(BinaryTreeNode treeNode){        if(treeNode != null){            return treeNode.right;        }else{            return null;        }    }    /**     * 传入根节点判断该树是否为空     * @param treeNode     * @return     */    public boolean treeIsEmpty(BinaryTreeNode treeNode){        if(treeNode == null){            return true;        }else{            return false;        }    }    /**     * 传入二叉树的根节点,得到该二叉树的深度     * @param treeNode     * @return     */    public int treeDepth(BinaryTreeNode 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;            }        }    }    /**     * 显示节点的数据     * @param treeNode     */    public void treeNodeData(BinaryTreeNode treeNode){        System.out.println(treeNode.data);    }    /**     * 二叉树的先序遍历     * @param treeNode     */    public void preOrder(BinaryTreeNode treeNode){        if(treeNode != null){            treeNodeData(treeNode);            preOrder(treeNode.left);            preOrder(treeNode.right);        }    }    /**     * 二叉树的中序遍历     * @param treeNode     */    public void inOrder(BinaryTreeNode treeNode){        if(treeNode != null){            inOrder(treeNode.left);            treeNodeData(treeNode);            inOrder(treeNode.right);        }    }    /**     * 二叉树的后序遍历     * @param treeNode     */    public void postOrder(BinaryTreeNode treeNode){        if(treeNode != null){            postOrder(treeNode.left);            postOrder(treeNode.right);            treeNodeData(treeNode);        }    }    /**     * 二叉树按层遍历     * @param treeNode     */    public void levelTree(BinaryTreeNode treeNode){        BinaryTreeNode p;        BinaryTreeNode[] q = new BinaryTreeNode[MAXLEN];        int head=0;        int 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;            }        }    }}
1 0
原创粉丝点击