用C++搞定二叉树侧视图:从PTA天梯赛真题到LeetCode 199的实战迁移
当你在PTA天梯赛遇到"浪漫侧影"这道题时,是否曾困惑如何将中序/后序遍历转化为可视化的侧视图?这不仅是竞赛中的常见考点,更是LeetCode 199题"二叉树的右视图"的变种。本文将带你从竞赛真题出发,掌握三种实用解法,并实现向面试题的平滑迁移。
1. 理解问题本质:什么是二叉树侧视图?
想象你站在一棵二叉树的一侧,只能看到每层最边缘的节点——这就是侧视图的核心概念。左视图呈现每层最左侧节点,右视图则捕捉最右侧节点。这种视角转换在三维建模、UI渲染等领域都有实际应用。
关键特征:
- 视图序列长度 = 二叉树的最大深度
- 每层仅保留一个代表节点
- 遍历顺序决定节点可见性
注意:侧视图与常规遍历不同,它需要同时考虑层级信息和位置关系
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 从遍历序列重建二叉树
竞赛题通常要求先根据中序+后序序列构建二叉树。这是基础但关键的步骤:
cpp复制struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.empty()) return nullptr;
int rootVal = postorder.back();
TreeNode* root = new TreeNode(rootVal);
auto mid = find(inorder.begin(), inorder.end(), rootVal);
int leftSize = mid - inorder.begin();
vector<int> leftIn(inorder.begin(), mid);
vector<int> rightIn(mid+1, inorder.end());
vector<int> lef
