二叉树遍历

生成一棵二叉搜索树,并通过 C++ 递归函数逐步演示前序、中序或后序遍历。

所有内容均在此浏览器中模拟,不会发送到任何服务器。

先访问节点,再访问左子树,最后访问右子树。

以节点 60 调用函数

以节点 60 调用函数

二叉树

60458568215532

输出

尚未访问任何节点

  • 未访问
  • 运行中
  • 在栈中
  • 已访问

第 1 / 44 步

代码

#include <iostream>
using namespace std;
class Node { // 节点保存其值和指向两个子节点的指针
private: // 私有属性:只有方法可以访问
int value;
Node* left;
Node* right;
public:
Node(int v) : value(v), left(nullptr), right(nullptr) {}
int getValue() const { return value; }
Node* getLeft() const { return left; }
Node* getRight() const { return right; }
void setLeft(Node* n) { left = n; }
void setRight(Node* n) { right = n; }
};
void preorder(Node* node) { // 遍历以 node 为根的子树
if (node == nullptr) return; // 基本情况:空子树无需访问
cout << node->getValue() << " "; // 访问该节点:处理它的值
preorder(node->getLeft()); // 遍历左子树
preorder(node->getRight()); // 遍历右子树
} // 返回给调用者
Node* insert(Node* root, int v) { // 将 v 插入搜索树并返回根节点
if (root == nullptr) return new Node(v); // 空位:新节点放在这里
if (v < root->getValue()) // 较小的值放左边,较大的值放右边
root->setLeft(insert(root->getLeft(), v));
else
root->setRight(insert(root->getRight(), v));
return root;
}
Node* buildTree() { // 逐个插入数值来构建树
int values[] = {60, 45, 85, 68, 21, 55, 32}; // 所示树的数值,按插入顺序排列
Node* root = nullptr;
for (int v : values) root = insert(root, v);
return root;
}
int main() {
Node* root = buildTree(); // 动画中的树,已构建完成
preorder(root); // 首次调用,来自 main
cout << endl; // 遍历结束
return 0;
}

这个工具会生成一棵带随机值的二叉搜索树(BST),并用递归的C++函数逐步遍历它。你可以选择前序、中序或后序,在同一棵树上看到每个节点何时被访问:在子节点之前、之间还是之后。节点按状态着色(未访问、运行中、在栈上或已访问),输出条按访问顺序显示各值,代码则高亮正在执行的行。传入 nullptr 的调用也会显示,那是终止递归的基准情形。树的规模可在3到15个节点之间调整,也可以再生成另一棵树。所有内容都在浏览器中模拟。

使用方法

  1. 选择遍历方式:前序、中序或后序。
  2. 用滑块调整树的大小,或点击“生成新树”;动画会回到第一步。
  3. 点击“播放”,或用上一步和下一步按钮前进,必要时调整速度。
  4. 观察着色的节点、显示已访问值的输出条以及高亮的C++代码行。

常见问题

什么是二叉树,什么是二叉搜索树?
二叉树是每个节点最多有左右两个子节点的结构。在二叉搜索树(BST)中,左子树的值都小于该节点,右子树的值都大于该节点。
前序、中序和后序有什么区别?
区别在于相对于子节点,何时访问该节点。前序先访问节点,再访问左右子树;中序依次是左子树、节点、右子树;后序依次是左子树、右子树,最后才是节点。前序用于复制树,中序用于按顺序读取BST,后序用于释放或求值,因为子节点先于父节点处理。
为什么BST的中序遍历结果是有序的?
因为在BST中,节点左边的所有值更小,右边的所有值更大。先访问左子树,再访问节点,然后访问右子树,就会得到从小到大的值。
如何用C++实现递归遍历?
写一个接受节点指针的函数。如果指针是 nullptr,就直接返回,什么也不做:这就是基准情形。否则访问该节点,并按遍历要求的顺序,用左孩子和右孩子调用自身。

相关工具