二叉树——二叉链表存储

public class TwoLinkBinTree {
    public class TreeNode{//创建树节点内部类
        String data;
        TreeNode left;
        TreeNode right;
        public TreeNode(){}
        public TreeNode(String data){
            this.data=data;
        }
        public TreeNode(String data,TreeNode left,TreeNode right){
            this.data=data;
            this.left=left;
            this.right=right;
        }
    }
    private TreeNode root;
    public TwoLinkBinTree(){//默认构造器创建二叉树
        this.root=new TreeNode();
    }
    public TwoLinkBinTree(String data){//指定根元素来创建二叉树
        this.root=new TreeNode(data);
    }
    /*
    为指定节点添加子节点;
    index,该指定节点的索引;
    data,该子节点的父节点的索引;
    left,判断是否是左节点
    * */
    public TreeNode addNode(TreeNode parent,String data,boolean left){
        if(parent==null){
            throw new RuntimeException("该节点为空,无法添加子节点");
        }
        if(left&&parent.left!=null){
            throw new RuntimeException("已有左子节点");
        }
        if(!left&&parent.right!=null){
            throw new RuntimeException("已有右子节点");
        }
        TreeNode newNode=new TreeNode(data);
        if(left){
            parent.left=newNode;
        }else{
            parent.right=newNode;
        }
        return newNode;
    }
    public boolean empty(){//判断二叉树是否为空
        return root.data==null;
    }
    public TreeNode getRoot(){//返回根节点
        if(empty()){
            throw new RuntimeException("树为空");
        }
        return root;
    }
    //返回指定节点(非叶子)的左子节点。当左子节点不存在时返回null
    public String leftNode(TreeNode parent){
        if(parent==null){
            throw new RuntimeException("该指定节点不存在");
        }
        return parent.left==null?null:parent.left.data;
    }
    //返回指定节点(非叶子)的右子节点。当右子节点不存在时返回null
    public String rightNode(TreeNode parent){
        if(parent==null){
            throw new RuntimeException("该指定节点不存在");
        }
        return parent.right==null?null:parent.right.data;
    }
    public int getDeep(){
        return getDeep(root);
    }
    private int getDeep(TreeNode node){//递归获取深度
        if(node==null){
            return 0;
        }
        if(node.right==null&&node.left==null){
            return 1;
        }else{
            int leftdeep=getDeep(node.left);
            int rightdeep=getDeep(node.right);
            int max=leftdeep>rightdeep?leftdeep:rightdeep;
            return max+1;
        }
    }

    public static void main(String[] args) {
        TwoLinkBinTree twoLinkBinTree=new TwoLinkBinTree("root");
        TwoLinkBinTree.TreeNode node1=twoLinkBinTree.addNode(twoLinkBinTree.getRoot(),"1",true);
        TwoLinkBinTree.TreeNode node2=twoLinkBinTree.addNode(twoLinkBinTree.getRoot(),"2",false);
        TwoLinkBinTree.TreeNode node3=twoLinkBinTree.addNode(node2,"3",true);
        TwoLinkBinTree.TreeNode node4=twoLinkBinTree.addNode(node2,"4",false);
        System.out.println(node2.left.data);
        System.out.println(node2.right.data);
        System.out.println(twoLinkBinTree.getDeep());
        System.out.println(twoLinkBinTree.getRoot().data);
    }
}

猜你喜欢

转载自blog.csdn.net/Answer0902/article/details/82457511