#include <iostream>
#include <iomanip>
 
struct Binode
{
    char data ;
    Binode* r ;
    Binode* l ;
};

struct Indent {
  static unsigned level ;
  
  Indent() { std::cout << std::setw(level) << "" << "{\n"; level += 4 ; }
  ~Indent() { level -=4 ;  std::cout << std::setw(level) << "" << "}\n" ; }
};

std::ostream& operator<<(std::ostream& os, const Indent & indent)
{
    return os << std::setw(Indent::level) << "" ;
}

unsigned Indent::level = 0 ;
 
unsigned depth(Binode* p)
{
    Indent indent ;
    std::cout << indent  ;
    
    if  ( p == nullptr )
    {
        std::cout << "NULL\n" ;
        return 0 ;
    }
    std::cout << p->data << '\n' ;
 
    std::cout << indent << p->data << ": right node\n" ;
    unsigned rdepth = depth(p->r) ;
    std::cout << indent << "rdepth: " << rdepth << '\n' ;
    
    std::cout << indent << p->data << ": left node\n" ;
    unsigned ldepth = depth(p->l) ;
    std::cout << indent << "ldepth: " << ldepth << '\n' ;
 
    std::cout << indent << "Returning: " << (rdepth < ldepth ? 1+ldepth : 1+rdepth) << '\n' ;
    return rdepth < ldepth ? 1+ldepth : 1+rdepth ;
}
 
int main()
{
    Binode a { 'a', nullptr, nullptr };
    Binode b { 'b', &a, nullptr } ;
    Binode c { 'c', &b, nullptr } ;
    
    std::cout << depth(&c) << '\n' ;
}