6种形态:
满二叉树和完全二叉树:
完全二叉树:
最后一层叶子节点可以为空,并且叶子必须靠左排列
节点 = 数据域(值) + 关系域(指针/下标)
指针式(传统写法) struct Node { // 我们口中的“节点对象” int val; // 数据域 Node* left; // 关系域:两个指针 Node* right; }; 每 new 一个 Node,就在堆里拿到一块散落的内存, left/right 里填的是真正的内存地址。 数组式(拍扁写法) int tree[MAXN]; // 只存数据,不存指针 所谓“节点”此时被压缩成一个整数(或其他 POD 类型),整棵树只占一段连续 int。 父子关系不再用地址,而是用下标公式: leftIdx = 2*i + 1 rightIdx = 2*i + 2 因此数组里的每个元素依旧代表“一个节点”,只是它的“关系”被隐含在公式里,而不再显式存储。
int t[3] = {3,1,4}; // 下标 0 是根,1 是左,2 是右
二叉树一般采用链式存储
t[2*0+2] = t[2] = 4
,无需解引用任何指针。