题目:
Given a binary tree, collect a tree's nodes as if you were doing this: Collect and remove all leaves, repeat until the tree is empty.
Example:
Given binary tree
1 / \ 2 3 / \ 4 5
Returns [4, 5, 3], [2], [1]
.
Explanation:
1. Removing the leaves [4, 5, 3]
would result in this tree:
1 / 2
2. Now removing the leaf [2]
would result in this tree:
1
3. Now removing the leaf [1]
would result in the empty tree:
[]
Returns [4, 5, 3], [2], [1]
.
思路:
一道中等难度的递归题目:当root不为叶子结点时,一直从root这棵树上剪掉叶子,并且将所有的叶子返回;直到root为叶子时,将它作为最后一层唯一的一片叶子加入结果集中即可。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> findLeaves(TreeNode* root) {
if (root == NULL) {
return {};
}
vector<vector<int>> ans;
while (!isLeaf(root)) {
ans.push_back(getLeaves(root));
}
ans.push_back({root->val});
return ans;
}
private:
vector<int> getLeaves(TreeNode* root) {
if (root == NULL) {
return {};
}
vector<int> ret;
if (isLeaf(root->left)) {
ret.push_back(root->left->val);
delete root->left, root->left = NULL;
}
else {
vector<int> ret_left = getLeaves(root->left);
ret.insert(ret.end(), ret_left.begin(), ret_left.end());
}
if (isLeaf(root->right)) {
ret.push_back(root->right->val);
delete root->right, root->right = NULL;
}
else {
vector<int> ret_right = getLeaves(root->right);
ret.insert(ret.end(), ret_right.begin(), ret_right.end());
}
return ret;
}
bool isLeaf(TreeNode* node) {
return (node && node->left == NULL && node->right == NULL);
}
};