- Algorithm
-
Inorder: 考察到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子树。(左根右)
4,7,6,8,2,1,3,5[输出前判断其左子树遍历完没]
-
Postorder: 考察到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值。(左右根)
7,8,6,4,2,5,3,1[输出前判断左右子树遍历完没]
-
Preorder: 考察到一个节点后,即刻输出该节点的值,并继续遍历其左右子树。(根左右)
1,2,4,6,7,8,3,5[见谁输出谁]
-
level-order: 前三种都要栈来实现(递归也是栈),层次遍历用队列
- 将根节点放入队列
- 之后循环执行:取出队列头元素 cur,cur->left,cur->right,并依次讲孩子们放入队列
- 1,2,3,4,5,6,7,8
Nothing, just do it.
数节点个数等
使用条件: 顺序排列,连续的储存空间
-
code
int binary_search(const int arr[], int start, int end, int khey) { if (start > end) return -1; int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法 if (arr[mid] > khey) return binary_search(arr, start, mid - 1, khey); else if (arr[mid] < khey) return binary_search(arr, mid + 1, end, khey); else return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於 }
- 执行查找,插入,删除是目前最快的数据结构
- 元素键值不重复
- 左子树键值小于根
- 右子树键值大于根
在二叉搜索树 b 中插入节点 s 递归执行
- 若 b 空树,则直接插入
- 若 s->data 等于 b 的根节点数据,返回
- 若小于,则插到左子树中
- 若大于,则插到右子树中
/* 当二叉查找树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE,否则返回 FALSE */
bool InsertBST(BiTree *&T, ElemType e) {
if (!T) {
s = new BiTNode;
s->data = e;
s->lchild = s->rchild = NULL;
T = s; // 被插節点*s为新的根结点
} else if (e.key == T->data.key)
return false;// 关键字等于e.key的数据元素,返回錯誤
if (e.key < T->data.key)
InsertBST(T->lchild, e); // 將 e 插入左子樹
else
InsertBST(T->rchild, e); // 將 e 插入右子樹
return true;
}
- 直接删掉,令 pp 指向 null 即可
- 直接删掉,令 pp 指向 PL/PR 即可
一定是完全二叉树 对于 n 个选手,构造 2n 个节点的完全二叉树[数组实现]
父节点为两个孩子中的胜者的指针
父节点为两个孩子中的失败者的指针
左孩子,右兄弟
- 先序遍历: 等价于先序遍历对应的树 T
T&F:ABCDEFGHJI
- 中序遍历: 等价于中序遍历对应的树 T
T&F:BCDAFEJHIG
- 后序遍历: 与之对应的树 T 无自然的对应关系[?]
- T: DCBFJIHGEA
- F: BCDAFEJHIG
- 森林的后序遍历与树的中序一样
- 层次遍历: 按序从左到右遍历每一层,与树 T 遍历结果不一定相同
- T: ABECFGDHJI
- F: ABCDEFGHIJ