| 類型 | 定義 | 性質 |
|---|---|---|
| 滿二叉樹 | 所有非葉節點度=2,葉節點同層 | 節點數 = 2h-1,h 為高度 |
| 完全二叉樹 | 除最後層外滿,最後層靠左連續 | 可用數組緊湊存儲,堆的基礎 |
| 二叉搜索樹(BST) | 左≤根≤右 | 中序遍歷有序,查找/插入/刪除 O(h) |
typedef struct Node {
int data;
struct Node *left, *right;
} Node;
#define MAX 100
int tree[MAX]; // 根下標 1,左 2i,右 2i+1
void PreOrder(Node *root) { // 根-左-右
if (!root) return;
visit(root->data);
PreOrder(root->left);
PreOrder(root->right);
}
void InOrder(Node *root) { // 左-根-右
if (!root) return;
InOrder(root->left);
visit(root->data);
InOrder(root->right);
}
void PostOrder(Node *root) { // 左-右-根
if (!root) return;
PostOrder(root->left);
PostOrder(root->right);
visit(root->data);
}
應用:前序-複製樹/前綴表達式;中序-BST 輸出有序序列/中綴表達式;後序-釋放樹/後綴表達式。
void LevelOrder(Node *root) {
if (!root) return;
Node *q[1000]; int front=0, rear=0;
q[rear++] = root;
while (front < rear) {
Node *cur = q[front++];
visit(cur->data);
if (cur->left) q[rear++] = cur->left;
if (cur->right) q[rear++] = cur->right;
}
}
typedef struct { Node *root; int cnt; } BST;
Node* CreateNode(int val) {
Node *n = malloc(sizeof(Node));
n->data = val; n->left = n->right = NULL;
return n;
}
/* 插入 */
void Insert(Node **root, int val) {
if (!*root) { *root = CreateNode(val); return; }
if (val < (*root)->data) Insert(&(*root)->left, val);
else Insert(&(*root)->right, val);
}
/* 查找:返回指向目標節點指針的指針,便於刪除 */
Node** Find(Node **root, int val) {
if (!*root) return root;
if (val == (*root)->data) return root;
return val < (*root)->data ? Find(&(*root)->left, val) : Find(&(*root)->right, val);
}
/* 刪除:合併左右子樹 */
void Delete(Node **root, int val) {
Node **target = Find(root, val);
if (!*target) return;
Node *victim = *target;
if (victim->left) Insert(&victim->right, victim->left->data); // 簡化:實際應整棵子樹合併
*target = victim->right; // 此處為簡化演示,完整合併見下文
free(victim);
}
/* 完整合併刪除 */
void DeleteFull(Node **root, int val) {
Node **t = Find(root, val);
if (!*t) return;
Node *v = *t;
if (v->left) {
// 將左子樹插入右子樹
Node **p = &v->right;
while (*p) p = (*p)->data > v->left->data ? &(*p)->right : &(*p)->left;
*p = v->left;
}
*t = v->right;
free(v);
}
void InOrderIter(Node *root) {
Node *stack[1000]; int top = 0;
Node *p = root;
while (p || top) {
while (p) { stack[top++] = p; p = p->left; }
p = stack[--top];
visit(p->data);
p = p->right;
}
}
std::map/set、Linux 內核 rb_tree),手寫僅為理解原理。