题解 | #输出二叉树的右视图#
输出二叉树的右视图
https://www.nowcoder.com/practice/c9480213597e45f4807880c763ddd5f0
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 求二叉树的右视图 * @param xianxu int整型vector 先序遍历 * @param zhongxu int整型vector 中序遍历 * @return int整型vector */ // 建树函数 // 四个int参数分别是前序最左节点下标,前序最右节点下标 // 中序最左节点下标,中序最右节点下标 TreeNode* buildTree(vector<int>& xianxu, int l1, int r1, vector<int>& zhongxu, int l2, int r2){ if(l1 > r1 || l2 > r2) return NULL; // 构建节点 TreeNode* root = new TreeNode(xianxu[l1]); // 用来保存根节点在中序遍历列表的下标 int rootIndex = 0; // 寻找根节点 for(int i = 0; i < zhongxu.size(); ++i){ if(zhongxu[i] == xianxu[l1]){ rootIndex = i; break; } } // 左子树大小 int leftsize = rootIndex - l2; // 右子树大小 int rightsize = r2 - rootIndex; // 递归构建左子树和右子树 root->left = buildTree(xianxu, l1 + 1, l1 + leftsize, zhongxu, l2, l2 + leftsize - 1); root->right = buildTree(xianxu, r1 - rightsize + 1, r1, zhongxu, rootIndex + 1, r2); return root; } // 深度优先搜索函数 vector<int> rightSideView(TreeNode* root){ // 右边最深处的值 unordered_map<int, int> mp; // 记录最大深度 int max_depth = -1; // 维护深度访问节点 stack<TreeNode*> nodes; // 维护dfs时的深度 stack<int> depths; nodes.push(root); depths.push(0); while(!nodes.empty()){ TreeNode* node = nodes.top(); nodes.pop(); int depth = depths.top(); depths.pop(); if(node != NULL){ // 维护二叉树的最大深度 max_depth = max(max_depth, depth); // 如果不存在对应深度的节点我们才插入 if(mp.find(depth) == mp.end()) mp[depth] = node->val; nodes.push(node->left); nodes.push(node->right); depths.push(depth + 1); depths.push(depth + 1); } } vector<int> res; for(int i = 0; i <= max_depth; ++i) res.push_back(mp[i]); return res; } vector<int> solve(vector<int>& xianxu, vector<int>& zhongxu) { vector<int> res; // 空节点 if(xianxu.size() == 0){ return res; } // 建树 TreeNode* root = buildTree(xianxu, 0, xianxu.size() - 1, zhongxu, 0, zhongxu.size() - 1); // 找每一层最右边的节点 return rightSideView(root); } };
如果给出一个二叉树,直接输出右视图的话,层序遍历,取每层最右侧节点就好,这个题目要先根据先序遍历、中序遍历建树,建树的过程有点儿没搞懂~~~建树完成之后的深度优先搜索(dfs)也有点儿难懂~~~