基于矢量的二叉树遍历
Vector based binary tree traversal
我有一个基于向量的二叉树,需要使用各种遍历方法对树中的每个值应用一个函数。使用递归函数很容易实现预序遍历,但是我一直无法对无序和后序遍历做同样的事情。如果有人能帮忙,那就太好了!
我应该包括的一些额外信息:我正在使用节点向量,每个节点包含一个布尔变量,说明该节点是否已填充和一个模板化的数据变量。每个节点存储在索引"i"处,而其左子节点存储在索引"2i+1"处,右子节点存储在索引"2i+2"处。
为了对列表应用预序遍历,我首先处理了存储在索引 0 处的数据,然后调用了这个递归函数
template <typename Item, typename Key>
template <typename Function>
void BST<Item,Key>::preTraverse(int n, Function f) {
if(tree[n].occupied == false) return;
else {
f(tree[n].data);
preTraverse(2*i+1,f);
preTraverse(2*i+2,f);
}
}
两次以索引 1 和 2 开头作为我的"n"参数。
预购:
do something with the value
f(go to the left)
f(go to the right)
序:
f(go to the left)
do something with the value
f(go to the right)
后序:
f(go to the left)
f(go to the right)
do something with the value
假设你的树是一个最大填充的左主导表示,那么数组中位置 i
的任何给定点都将在位置 2*i+1
和 2*i+2
处有子点。琐碎的步行:
Node Children
===== ===========
ar[0]: ar[1], ar[2]
ar[1]: ar[3], ar[4]
ar[2]: ar[5], ar[6]
ar[3]: ar[7], ar[8]
ar[4]: ar[9], ar[10] etc...
根据这个定义,预购、后序和按顺序都可以通过简单的索引转发和对"占用"标志的一些检查来完成。以下模板假定类型 T
是具有"占用"成员的结构类型。
template<typename T>
void preorder(const T ar[], size_t i, size_t count, void (&visit)(const T&))
{
if (i>=count || !ar[i].occupied)
return;
visit(ar[i]);
preorder(ar, 2*i+1, count, visit);
preorder(ar, 2*(i+1), count, visit);
}
template<typename T>
void inorder(const T ar[], size_t i, size_t count, void (&visit)(const T&))
{
if (i>=count || !ar[i].occupied)
return;
inorder(ar, 2*i+1, count, visit);
visit(ar[i]);
inorder(ar, 2*(i+1), count, visit);
}
template<typename T>
void postorder(const T ar[], size_t i, size_t count, void (&visit)(const T&))
{
if (i>=count || !ar[i].occupied)
return;
postorder(ar, 2*i+1, count, visit);
postorder(ar, 2*(i+1), count, visit);
visit(ar[i]);
}
相关文章:
- 二叉树级别顺序遍历在leetcode中
- 使用二叉树的关卡顺序概念的垂直顺序遍历
- 之字折线二叉树遍历C++
- 二叉树级别顺序遍历 LeetCode
- 如何修复关卡顺序遍历问题(二叉树)的无限循环错误
- 二叉树顺序遍历在C++
- C++,如何创建和绘制二叉树,然后按预购方式遍历它
- 二叉树顺序遍历错误:没有用于调用的匹配函数
- 基于矢量的二叉树遍历
- 这种遍历二叉树的递归方法在一些递归后崩溃!为什么?
- 如何遍历二叉树并在不传递值的情况下计算值的出现次数
- 使用递归的顺序二叉树遍历与使用堆栈的优缺点
- 使用递归的顺序和预序遍历 - 二叉搜索树 C++
- 遍历二叉搜索树C++
- 从序遍历和预序遍历构造二叉树的时间复杂性
- 使用级别顺序遍历将节点插入二叉树
- 递归后序遍历解除分配二叉树节点
- 遍历二叉树的函数
- 无法使用非递归顺序方法遍历二叉树
- 是否可以使用迭代而不是递归来遍历二叉树?