/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2020-11-16/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/java-new/bintree-2020-11-10-03/BinTreeProg.java


public class BinTreeProg {
    
    public static void main (String [] args) {
        try {
            int i;
            BinTree2 root = new BinTree2(args[0]);
            
            for (i = 1;  i < args.length-1;  i++)
                root.binTree2Insert (args[i]);
            root.binTree2Traverse();
            
            System.out.println (root.binTree2Exists (args[args.length-1]));
            System.out.println (root.binTree2CountOccurance (args[args.length-1]));
            /*System.out.println (root.binTree2BalancedCounter (args[args.length-1]));
            System.out.println (root.binTree2TotalyBalanced());
            System.out.println (root.binTree2MaxPathLength());
            System.out.println (root.binTree2CountNodes());*/
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println ("Usage: BinTree2Prog Data1 Data2 Data3 ...Keyword");
            System.exit (-1);
        }
    }
    
    static class BinTree {
        BinTree l;
        BinTree r;    
        String v;
        
        BinTree getl () {
            return this.l;
        }
        BinTree getr () {
            return this.r;
        }
        void binTree2Insert (String val) {}
        void binTree2Traverse () {}
        boolean binTree2Exists (String val) {return false;}
        int binTree2CountOccurance (String val) {return 0;}
        boolean binTree2isBalanced (String val) {return false;}
        int binTree2MaxPathLength () {return 0;}
        int binTree2CountNodes () {return 0;}
        int binTree2BalancedCounter (String val) {return 0;}
        boolean binTree2TotalyBalanced () {return false;}
    }
    
    static class BinTree2 extends BinTree {
        String v;
        
        BinTree2 (String val) {
            this.v = val;
        }
        
        void binTree2Insert (String val) {
            if (this.v.compareTo (val) < 0) {
                if (getl() == null) 
                    this.l = new BinTree2 (val);
                else
                    getl().binTree2Insert (val);
            }
            else {
                if (getr() == null) 
                    this.r = new BinTree2 (val);
                else
                    getr().binTree2Insert (val);
            }
        }
        void binTree2Traverse () {
            if (getl() != null)
                getl().binTree2Traverse();
            System.out.println (this.v);
            if (getr() != null)
                getr().binTree2Traverse();
        }
        boolean binTree2Exists (String val) {
            boolean flag;
            
            if (this.v.compareTo (val) == 0)
                flag = true;
            else if (this.v.compareTo (val) < 0) {
                if (getl() == null)
                    flag = false;
                else
                    flag = getl().binTree2Exists (val);
            }
            else {
                if (getr() == null)
                    flag = false;
                else
                    flag = getr().binTree2Exists (val);
            }
            return flag;
        }
        int binTree2CountOccurance (String val) {
            int count = 0;
            
            if (this.v.compareTo (val) == 0) {
                if (getl() != null)
                    count = 1 + getl().binTree2CountOccurance(val);
                else 
                    count = 0;
                if (getr() != null)
                    count = 1 + getr().binTree2CountOccurance(val);
            }
            else if (this.v.compareTo (val) < 0) {
                if (getl() == null)
                    count = 0;
                else
                    count = getl().binTree2CountOccurance (val);
            }
            else {
                if (getr() == null)
                    count = 0;
                else
                    count = getr().binTree2CountOccurance (val);
            }
            return count;
        }
        boolean binTree2isBalanced (String val) {
            if (binTree2BalancedCounter (val) != 0)
                return false;
            return true;
        }
        int binTree2BalancedCounter (String val) {
            int retval = 0;
            
            if (getl() != null) {
                if (getl().v.compareTo (val) == 0)
                    retval += (1+getl().binTree2BalancedCounter (val));
                else
                    retval += getl().binTree2BalancedCounter (val);
            }
            else
                retval += 0;            
            if (getr() != null) {
                if (getr().v.compareTo (val) == 0)
                    retval += (-1+getr().binTree2BalancedCounter (val));
                else
                    retval += getr().binTree2BalancedCounter (val);
            }
            else 
                retval += 0;
            return retval;
        }
        boolean binTree2TotalyBalanced () {
            boolean retval = true;
            
            if (getl() != null)
                retval = retval && getl().binTree2TotalyBalanced();
            retval = retval && binTree2isBalanced(this.v);
            if (getr() != null)
                retval = retval && getr().binTree2TotalyBalanced();
            return retval;
        }
        int binTree2MaxPathLength () {
            int lengthl = 0;
            int lengthr = 0;
            int length = 0;
            
            
            if ((getl() == null) && (getr() == null))
                length = 1;
            else  {
                if (getl() != null)
                    lengthl = getl().binTree2MaxPathLength();
                if (getr() != null)
                    lengthr = getr().binTree2MaxPathLength();
            
                if (lengthl > lengthr)
                    length = lengthl + 1;
                else 
                    length = lengthr + 1;
            }
            return length;
        }
        
        int binTree2CountNodes () {
            int count = 0;
            if (getl() != null)
                count += getl().binTree2CountNodes();
            count += 1;
            if (getr() != null)
                count += getr().binTree2CountNodes();
            return count;
        }
    }
}