二叉树遍历
生成一棵二叉搜索树,并通过 C++ 递归函数逐步演示前序、中序或后序遍历。
所有内容均在此浏览器中模拟,不会发送到任何服务器。
先访问节点,再访问左子树,最后访问右子树。
以节点 60 调用函数
以节点 60 调用函数
二叉树
输出
尚未访问任何节点
- 未访问
- 运行中
- 在栈中
- 已访问
第 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;
}