reference: 数据结构 邓俊辉 第三版
#include<iostream>
using std::swap;
using std::cout;
using std::cin;
using std::endl;
using std::max;
#define pnode node*
#define isRoot(x) (!((x).parent))
#define isLChild(x) (!isRoot(x) && (&(x) == (x).parent->lc))
#define isRChild(x) (!isRoot(x) && (&(x) == (x).parent->rc))
#define HasLChild(x) ((x).lc)
#define HasRChild(x) ((x).rc)
#define HasParent(x) (!isRoot(x))
#define FromParentTo(x) (isRoot(x)?_root:isLChild(x)?(x).parent->lc:(x).parent->rc)
#define stature(p) ((p) ? (p)->height:-1)
#define Balanced(x) (stature((x).lc)== stature((x).rc))
#define BalFac(x) (stature((x).lc)-stature((x).rc))
#define AvlBalanced(x) ((-2<BalFac(x)) && (BalFac(x)<2))
#define tallerChild(x) (\
stature((x)->lc) > stature((x)->rc)