比较高度优先考虑后序遍历,用后序遍历的递归方式解决很简单:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int gettree(TreeNode* root){
if(root == NULL){
return 0;
}
int getleft = gettree(root -> left);
if(getleft == -1) return -1;
int getright = gettree(root -> right);
if(getright == -1) return -1;
return abs(getleft - getright) > 1 ? -1 : 1 + max(getleft, getright);
}
bool isBalanced(TreeNode* root) {
return gettree(root) == -1 ? false : true;
}
};
这道题的难点在于理解每遍历完一条路线时要怎么回溯到该条路线的出发点开始遍历下一条路线,这道题我先是跟着视频的讲解自己写了一遍前序遍历的版本,依照遍历顺序根左右,现将根的val存入到path数组中,接着判断当前节点是否为叶子结点,若是则遍历path数组内的元素将其强转为string类型并加入到字符串spath中,在最和一个字符特殊判断一下即可。若不是叶子结点则则向左递归,但在这里我们需要重视一个点,一个递归对应一个回溯,我们在递归后紧接着要跟上一步回溯弹出当前路线的最后一个节点也就是叶子结点,在这里有一个理解的难点在于为什么这么操作会将当前路线起始节点外的节点弹出,因为我们是先进行了的递归操作紧接着进行了弹出当前元素。我觉得有些抽象要去想递归的整个过程。。。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void trave(TreeNode* root, vector& res, vector& path){
path.push_back(root -> val);
string spath;
if(root -> left == NULL && root -> right == NULL){
for(int i = 0; i < path.size() - 1; i++){
spath += to_string(path[i]);
spath += "->";
}
spath += to_string(path[path.size() - 1]);
res.push_back(spath);
}
if(root -> left != NULL){
trave(root -> left, res, path);
path.pop_back();
}
if(root -> right != NULL){
trave(root -> right, res, path);
path.pop_back();
}
}
vector binaryTreePaths(TreeNode* root) {
vector result;
vector path;
trave(root, result, path);
return result;
}
};
这道题首先需要搞明白左叶子是什么,这里的左叶子的判断标准是一个节点的左孩子不为空,该左孩子的左孩子为空,该左孩子的右孩子也为空。
if(node -> left != NULL && node -> left -> left == NULL && node -> left -> right == NULL){
return ;
}
我一开始有个不懂得点就是求lefttree和判断是否为叶子节点的顺序在判断叶子结点的内部为什么又对lefttree再次赋值。这里的lefttree是求得坐姿树叶子节点的和,就是每个sum函数的最后返回值是左右子树左叶子节点的和。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == NULL) return 0;
int lefttree = sumOfLeftLeaves(root -> left);
if(root -> left != NULL && root -> left -> left == NULL && root -> left -> right == NULL){
lefttree = root -> left -> val;
}
int righttree = sumOfLeftLeaves(root -> right);
int sum = lefttree + righttree;
return sum;
}
};
2024/3/13 12:10
------------------magixx