GeeksforGeeks二叉树左视图left view代码无法输出预期结果怎么解决?
二叉树左视图代码问题排查与修复
现有代码的核心问题
- 递归返回值未合并:你调用
leftView(root->left)、leftView(root->right)后,没有把递归调用返回的结果添加到当前函数的ans数组中,最终返回的数组永远只会包含当前节点的值,更深层的结果全部丢失。 - 逻辑覆盖缺失:现有逻辑只处理了当前节点无左子节点时走右子树的场景,但是如果左子树的高度小于右子树,右子树中更深层的左视图节点会被直接忽略,无法被采集到结果中。比如左子树只有2层,右子树有4层,那么第3、4层的左视图节点都会丢失。
正确实现思路
两种主流实现方式:
- 层序遍历(BFS):按层遍历二叉树,每一层取第一个节点的值加入结果数组,天然符合左视图的定义。
- 深度优先遍历(DFS):优先遍历左子树,遍历时携带当前深度参数,记录已经采集过结果的深度,第一次碰到某个深度的节点时,就将其值加入结果数组。
修正后的DFS实现代码
这里用更省空间的最大深度标记方案实现:
void dfs(Node* root, int level, int& maxLevel, vector<int>& ans) { if (root == nullptr) return; // 首次访问该深度,加入结果 if (level > maxLevel) { ans.push_back(root->data); maxLevel = level; } // 优先遍历左子树,保证同层左节点先被访问 dfs(root->left, level + 1, maxLevel, ans); dfs(root->right, level + 1, maxLevel, ans); } vector<int> leftView(Node *root) { vector<int> ans; int maxLevel = -1; dfs(root, 0, maxLevel, ans); return ans; }
内容的提问来源于stack exchange,提问作者Aswini Verma
相关产品推荐
相关产品推荐

