标签:ret 位置 cpp 数组 遍历二叉树 完全二叉树 其他 注意 排序二叉树
满二叉树:
满二叉树示意图
完全二叉树:
完全二叉树示意图
二叉搜索树示意图
- 先序遍历
$先序遍历是指先访问根节点,再依次访问左子树和右子树$
- 中序遍历
$中序遍历是指先访问左子树,再依次访问根节点和右子树$
- 后序遍历
$先序遍历是指先访问左子树和右子树,最后再访问根节点$
- 层次遍历
$跟“扩展式广度优先搜索(俗称“广搜”)相同”$
- 四种遍历参考代码:
```cpp
int son[N][2], root;
vector
//先序遍历
void preorder(int u) {
if (u == 0) return;
v1.push_back(u);
preorder(son[u][0]);
preorder(son[u][1]);
}
//中序遍历
void inorder(int u) {
if (u == 0) return;
inorder(son[u][0]);
v2.push_back(u);
inorder(son[u][1]);
}
//后序遍历
void postorder(int u) {
if (u == 0) return;
postorder(son[u][0]);
postorder(son[u][1]);
v3.push_back(u);
}
//层次遍历
void levelorder() {
queue
if (root != 0) q.push(root);
while (!q.empty()) {
int u = q.front();
q.pop();
v4.push_back(u);
if (son[u][0] != 0) q.push(son[u][0]);
if (son[u][1] != 0) q.push(son[u][1]);
}
}
```
注意!先序遍历和后序遍历不能确定唯一的二叉树!
对于先序遍历和中序遍历,我们只需在先序遍历中确定根节点,并且靠中序遍历找出其位置,再依次还原左子树和右子树,即可确定二叉树。
对于后序遍历和中序遍历,也可按照同样的方法进行还原,确定唯一的二叉树。
参考代码:
// a数组为中序遍历,b数组为先序遍历
// x1、y1为当前子树在a数组中下标的范围,x2为前子树在b数组中下标的起点
int a[N], b[N], son[N][2];
void dfs(int x1, int y1, int x2) {
int pos = x1;
while (a[pos] != b[x2]) { // 在中序遍历里找到当前子树的根
pos++;
}
int len1 = pos - x1, len2 = y1 - pos; // 在中序遍历里确定当前子树的左子树和右子树大小
if (len1 > 0) { // 如果有左子树,那么根据先序遍历确定这个节点的左孩子
son[b[x2]][0] = b[x2 + 1];
dfs(x1, pos - 1, x2 + 1); // 递归进入左子树
}
if (len2 > 0) { // 如果有右子树,那么根据先序遍历确定这个节点的右孩子
son[b[x2]][1] = b[x2 + 1 + len1];
dfs(pos + 1, y1, x2 + 1 + len1); // 递归进入右子树
}
}
标签:ret 位置 cpp 数组 遍历二叉树 完全二叉树 其他 注意 排序二叉树
原文地址:https://www.cnblogs.com/littlefrog/p/12259066.html