From 45af5df13e720dd1ffa1c47ce6a7ee9460e256e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=94=90=E6=A0=91=E6=A3=AE?= <14021051@buaa.edu.cn> Date: Fri, 2 Nov 2018 23:13:14 +0800 Subject: [PATCH] Create 107. Binary Tree Level Order Traversal II.md --- 107. Binary Tree Level Order Traversal II.md | 46 ++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 107. Binary Tree Level Order Traversal II.md diff --git a/107. Binary Tree Level Order Traversal II.md b/107. Binary Tree Level Order Traversal II.md new file mode 100644 index 0000000..87cd8de --- /dev/null +++ b/107. Binary Tree Level Order Traversal II.md @@ -0,0 +1,46 @@ +# [107. Binary Tree Level Order Traversal II](https://leetcode.com/problems/binary-tree-level-order-traversal-ii/description/) +# 思路 +题目的意思就是层序遍历的变形,要逆序输出每一层的节点。为此我们先正常层序遍历并用一个stack记录每一层的节点。然后再依次出栈即可。 +用last指针指向每一层的最后一个节点,每当遍历到这个节点即说明遍历完一层,此时应该将此层所有节点压入栈。last初始为root, +后面每当遍历完每层最后一个节点后,即将last更新成下一层的最后一个节点,为此需要用一个next_last来不断记录能确定的下一层的最右节点。 +时间复杂度和空间复杂度都是O(n) + +# C++ +``` C++ +class Solution { +public: + vector> levelOrderBottom(TreeNode* root) { + TreeNode *p, *next_last,*last=root; + stack>stk; + queueq; + vector>res; + if(root == NULL) return res; + vectortmp; // 存放一层的节点 + q.push(root); + while(!q.empty()){ + p = q.front(); + q.pop(); + tmp.push_back(p -> val); + if(p -> left){ + q.push(p -> left); + next_last = p -> left; + } + if(p -> right) { + q.push(p -> right); + next_last = p -> right; + } + if(p == last){ + stk.push(tmp); + tmp.clear(); + last = next_last; // 更新last指针 + } + } + while(!stk.empty()){ + res.push_back(stk.top()); + stk.pop(); + } + return res; + } +}; +``` +