1、leetcode 力扣 199 二叉树的右视图 题解 算法题题目:二叉树的右视图给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:输入:1,2,3,null,5,null,4输出:1,3,4示例 2:输入:1,null,3输出:1,3示例 3:输入:输出:提示:二叉树的节点个数的范围是 0,100-100= Node.val Listint: rightmost_value_at_depth = dict() # 深度为索引,存放节点的值 max_depth = -1 stack = (root, 0) while stac
2、k: node, depth = stack.pop() if node is not None: # 维护二叉树的最大深度 max_depth = max(max_depth, depth) # 如果不存在对应深度的节点我们才插入 rightmost_value_at_depth.setdefault(depth, node.val) stack.append(node.left, depth + 1) stack.append(node.right, depth + 1) return rightmost_value_at_depthdepth for depth in range(max
3、_depth + 1)语言:Pythonclass Solution: def rightSideView(self, root: TreeNode) - Listint: rightmost_value_at_depth = dict() # 深度为索引,存放节点的值 max_depth = -1 queue = deque(root, 0) while queue: node, depth = queue.popleft() if node is not None: # 维护二叉树的最大深度 max_depth = max(max_depth, depth) # 由于每一层最后一个访问到的
4、节点才是我们要的答案,因此不断更新对应深度的信息即可 rightmost_value_at_depthdepth = node.val queue.append(node.left, depth + 1) queue.append(node.right, depth + 1) return rightmost_value_at_depthdepth for depth in range(max_depth + 1)语言:Javaclass Solution public List rightSideView(TreeNode root) Map rightmostValueAtDepth =
5、new HashMap(); int max_depth = -1; Deque nodeStack = new ArrayDeque(); Deque depthStack = new ArrayDeque(); nodeStack.push(root); depthStack.push(0); while (!nodeStack.isEmpty() TreeNode node = nodeStack.pop(); int depth = depthStack.pop(); if (node != null) / 维护二叉树的最大深度 max_depth = Math.max(max_dep
6、th, depth); / 如果不存在对应深度的节点我们才插入 if (!rightmostValueAtDepth.containsKey(depth) rightmostValueAtDepth.put(depth, node.val); nodeStack.push(node.left); nodeStack.push(node.right); depthStack.push(depth + 1); depthStack.push(depth + 1); List rightView = new ArrayList(); for (int depth = 0; depth = max_d
7、epth; depth+) rightView.add(rightmostValueAtDepth.get(depth); return rightView; 语言:Javaclass Solution public List rightSideView(TreeNode root) Map rightmostValueAtDepth = new HashMap(); int max_depth = -1; Queue nodeQueue = new ArrayDeque(); Queue depthQueue = new ArrayDeque(); nodeQueue.add(root);
8、depthQueue.add(0); while (!nodeQueue.isEmpty() TreeNode node = nodeQueue.remove(); int depth = depthQueue.remove(); if (node != null) / 维护二叉树的最大深度 max_depth = Math.max(max_depth, depth); / 由于每一层最后一个访问到的节点才是我们要的答案,因此不断更新对应深度的信息即可 rightmostValueAtDepth.put(depth, node.val); nodeQueue.add(node.left); n
9、odeQueue.add(node.right); depthQueue.add(depth + 1); depthQueue.add(depth + 1); List rightView = new ArrayList(); for (int depth = 0; depth = max_depth; depth+) rightView.add(rightmostValueAtDepth.get(depth); return rightView; 语言:Javaclass Solution public List rightSideView(TreeNode root) List res =
10、 new ArrayList(); if (root = null) return res; Queue queue = new LinkedList(); queue.offer(root); while (!queue.isEmpty() int size = queue.size(); for (int i = 0; i size; i+) TreeNode node = queue.poll(); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right);
11、 if (i = size - 1) /将当前层的最后一个节点放入结果列表 res.add(node.val); return res; 语言:C+class Solution public: vector rightSideView(TreeNode* root) unordered_map rightmostValueAtDepth; int max_depth = -1; stack nodeStack; stack depthStack; nodeStack.push(root); depthStack.push(0); while (!nodeStack.empty() TreeNo
12、de* node = nodeStack.top();nodeStack.pop(); int depth = depthStack.top();depthStack.pop(); if (node != NULL) / 维护二叉树的最大深度 max_depth = max(max_depth, depth); / 如果不存在对应深度的节点我们才插入 if (rightmostValueAtDepth.find(depth) = rightmostValueAtDepth.end() rightmostValueAtDepthdepth = node - val; nodeStack.push
13、(node - left); nodeStack.push(node - right); depthStack.push(depth + 1); depthStack.push(depth + 1); vector rightView; for (int depth = 0; depth = max_depth; +depth) rightView.push_back(rightmostValueAtDepthdepth); return rightView; ;语言:C+class Solution public: vector rightSideView(TreeNode* root) u
14、nordered_map rightmostValueAtDepth; int max_depth = -1; queue nodeQueue; queue depthQueue; nodeQueue.push(root); depthQueue.push(0); while (!nodeQueue.empty() TreeNode* node = nodeQueue.front();nodeQueue.pop(); int depth = depthQueue.front();depthQueue.pop(); if (node != NULL) / 维护二叉树的最大深度 max_depth
15、 = max(max_depth, depth); / 由于每一层最后一个访问到的节点才是我们要的答案,因此不断更新对应深度的信息即可 rightmostValueAtDepthdepth = node - val; nodeQueue.push(node - left); nodeQueue.push(node - right); depthQueue.push(depth + 1); depthQueue.push(depth + 1); vector rightView; for (int depth = 0; depth = max_depth; +depth) rightView.p
16、ush_back(rightmostValueAtDepthdepth); return rightView; ;语言:CPPclass Solution public: vectorvector levelOrder(TreeNode* root) queue que; if (root != NULL) que.push(root); vectorvector result; while (!que.empty() int size = que.size(); vector vec; / 这里一定要使用固定大小size,不要使用que.size(),因为que.size是不断变化的 for
17、 (int i = 0; i val); if (node-left) que.push(node-left); if (node-right) que.push(node-right); result.push_back(vec); return result; ;语言:CPPclass Solution public: vectorvector levelOrderBottom(TreeNode* root) queue que; if (root != NULL) que.push(root); vectorvector result; while (!que.empty() int s
18、ize = que.size(); vector vec; for (int i = 0; i val); if (node-left) que.push(node-left); if (node-right) que.push(node-right); result.push_back(vec); reverse(result.begin(), result.end(); / 在这里反转一下数组即可 return result; ;语言:CPPclass Solution public: vector rightSideView(TreeNode* root) queue que; if (
19、root != NULL) que.push(root); vector result; while (!que.empty() int size = que.size(); for (int i = 0; i val); / 将每一层的最后元素放入result数组中 if (node-left) que.push(node-left); if (node-right) que.push(node-right); return result; ;语言:go/*102. 二叉树的层序遍历 */func levelOrder(root *TreeNode) int res:=int if root
20、=nil/防止为空 return res queue:=list.New() queue.PushBack(root) var tmpArr int for queue.Len()0 length:=queue.Len()/保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数) for i:=0;i 0 length := len(que) for i := 0; i 0 length := que.Len() for i := 0; i length; i+ t := que.Front().Value.(*TreeNode) que.Remove(que.Fr
21、ont() if t.Left != nil que.PushBack(t.Left) if t.Right != nil que.PushBack(t.Right) if i = length - 1 ans = append(ans, t.Val) return ans语言:javascriptvar levelOrder = function(root) /二叉树的层序遍历 let res=,queue=; queue.push(root); if(root=null) return res; while(queue.length!=0) / 记录当前层级节点数 let length=q
22、ueue.length; /存放每一层的节点 let curLevel=; for(let i=0;ilength;i+) let node=queue.shift(); curLevel.push(node.val); / 存放当前层下一层的节点 node.left&queue.push(node.left); node.right&queue.push(node.right); /把每一层的结果放到结果数组 res.push(curLevel); return res;语言:javascriptvar levelOrderBottom = function(root) let res=,q
23、ueue=; queue.push(root); while(queue.length&root!=null) / 存放当前层级节点数组 let curLevel=; / 计算当前层级节点数量 let length=queue.length; while(length-) let node=queue.shift(); / 把当前层节点存入curLevel数组 curLevel.push(node.val); / 把下一层级的左右节点存入queue队列 node.left&queue.push(node.left); node.right&queue.push(node.right); res.push(curLevel); return res.reverse();语言:javascriptvar rightSideView = function(root) /二叉树右视图 只需要把每一层最后一个节点存储到res数组 let res=,queue=; queue.push
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1