Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit e548c2a

Browse files
raof01azl397985856
authored andcommitted
feat: azl397985856#103, azl397985856#129: add C++ implementation (azl397985856#63)
* Update 103.binary-tree-zigzag-level-order-traversal.md * azl397985856#129: add C++ implementation 写描述比写代码难。。。
1 parent 4f5e0fa commit e548c2a

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed

‎problems/103.binary-tree-zigzag-level-order-traversal.md‎

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ return its zigzag level order traversal as:
4444

4545
## 代码
4646

47+
* 语言支持:JS,C++
48+
49+
JavaScript Code:
50+
4751
```js
4852
/*
4953
* @lc app=leetcode id=103 lang=javascript
@@ -132,6 +136,77 @@ var zigzagLevelOrder = function(root) {
132136

133137
};
134138
```
139+
C++ Code:
140+
```C++
141+
/**
142+
* Definition for a binary tree node.
143+
* struct TreeNode {
144+
* int val;
145+
* TreeNode *left;
146+
* TreeNode *right;
147+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
148+
* };
149+
*/
150+
class Solution {
151+
public:
152+
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
153+
auto ret = vector<vector<int>>();
154+
if (root == nullptr) return ret;
155+
auto queue = vector<const TreeNode*>{root};
156+
auto isOdd = true;
157+
while (!queue.empty()) {
158+
auto sz = queue.size();
159+
auto level = vector<int>();
160+
for (auto i = 0; i < sz; ++i) {
161+
auto n = queue.front();
162+
queue.erase(queue.begin());
163+
if (isOdd) level.push_back(n->val);
164+
else level.insert(level.begin(), n->val);
165+
if (n->left != nullptr) queue.push_back(n->left);
166+
if (n->right != nullptr) queue.push_back(n->right);
167+
}
168+
isOdd = !isOdd;
169+
ret.push_back(level);
170+
}
171+
return ret;
172+
}
173+
};
174+
```
175+
## 拓展
176+
177+
由于二叉树是递归结构,因此,可以采用递归的方式来处理。在递归时需要保留当前的层次信息(从0开始),作为参数传递给下一次递归调用。
178+
179+
### 描述
180+
181+
1. 当前层次为偶数时,将当前节点放到当前层的结果数组尾部
182+
2. 当前层次为奇数时,将当前节点放到当前层的结果数组头部
183+
3. 递归对左子树进行之字形遍历,层数参数为当前层数+1
184+
4. 递归对右子树进行之字形遍历,层数参数为当前层数+1
185+
186+
### C++实现
187+
188+
```C++
189+
class Solution {
190+
public:
191+
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
192+
auto ret = vector<vector<int>>();
193+
zigzagLevelOrder(root, 0, ret);
194+
return ret;
195+
}
196+
private:
197+
void zigzagLevelOrder(const TreeNode* root, int level, vector<vector<int>>& ret) {
198+
if (root == nullptr || level < 0) return;
199+
if (ret.size() <= level) {
200+
ret.push_back(vector<int>());
201+
}
202+
if (level % 2 == 0) ret[level].push_back(root->val);
203+
else ret[level].insert(ret[level].begin(), root->val);
204+
zigzagLevelOrder(root->left, level + 1, ret);
205+
zigzagLevelOrder(root->right, level + 1, ret);
206+
}
207+
};
208+
```
209+
135210
## 相关题目
136211
- [102.binary-tree-level-order-traversal](./102.binary-tree-level-order-traversal.md)
137212
- [104.maximum-depth-of-binary-tree](./104.maximum-depth-of-binary-tree.md)

‎problems/129.sum-root-to-leaf-numbers.md‎

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ Therefore, sum = 495 +たす 491 +たす 40 = 1026.
6464

6565
## 代码
6666

67+
* 语言支持:JS,C++
68+
69+
JavaScipt Code:
70+
6771
```js
6872
/*
6973
* @lc app=leetcode id=129 lang=javascript
@@ -98,6 +102,85 @@ var sumNumbers = function(root) {
98102
};
99103
```
100104

105+
C++ Code:
106+
```C++
107+
/**
108+
* Definition for a binary tree node.
109+
* struct TreeNode {
110+
* int val;
111+
* TreeNode *left;
112+
* TreeNode *right;
113+
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
114+
* };
115+
*/
116+
class Solution {
117+
public:
118+
int sumNumbers(TreeNode* root) {
119+
return helper(root, 0);
120+
}
121+
private:
122+
int helper(const TreeNode* root, int val) {
123+
if (root == nullptr) return 0;
124+
auto ret = root->val + val * 10;
125+
if (root->left == nullptr && root->right == nullptr)
126+
return ret;
127+
auto l = helper(root->left, ret);
128+
auto r = helper(root->right, ret);
129+
return l + r;
130+
}
131+
};
132+
```
133+
134+
## 拓展
135+
136+
通常来说,可以利用队列、栈等数据结构将递归算法转为递推算法。
137+
138+
### 描述
139+
140+
使用两个队列:
141+
1. 当前和队列:保存上一层每个结点的当前和(比如49和40)
142+
2. 结点队列:保存当前层所有的非空结点
143+
144+
每次循环按层处理结点队列。处理步骤:
145+
1. 从结点队列取出一个结点
146+
2. 从当前和队列将上一层对应的当前和取出来
147+
3. 若左子树非空,则将该值乘以10加上左子树的值,并添加到当前和队列中
148+
4. 若右子树非空,则将该值乘以10加上右子树的值,并添加到当前和队列中
149+
5. 若左右子树均为空时,将该节点的当前和加到返回值中
150+
151+
### C++实现
152+
```C++
153+
class Solution {
154+
public:
155+
int sumNumbers(TreeNode* root) {
156+
if (root == nullptr) return 0;
157+
auto ret = 0;
158+
auto runningSum = vector<int>{root->val};
159+
auto queue = vector<const TreeNode*>{root};
160+
while (!queue.empty()) {
161+
auto sz = queue.size();
162+
for (auto i = 0; i < sz; ++i) {
163+
auto n = queue.front();
164+
queue.erase(queue.begin());
165+
auto tmp = runningSum.front();
166+
runningSum.erase(runningSum.begin());
167+
if (n->left != nullptr) {
168+
runningSum.push_back(tmp * 10 + n->left->val);
169+
queue.push_back(n->left);
170+
}
171+
if (n->right != nullptr) {
172+
runningSum.push_back(tmp * 10 + n->right->val);
173+
queue.push_back(n->right);
174+
}
175+
if (n->left == nullptr && n->right == nullptr) {
176+
ret += tmp;
177+
}
178+
}
179+
}
180+
return ret;
181+
}
182+
};
183+
```
101184
## 相关题目
102185

103186
- [sum-of-root-to-leaf-binary-numbers](https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers/)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /