110.平衡二叉树
看完想法:求深度和求高度的区别一定要弄懂。求深度是求从根节点到子节点的距离(自上而下),求高度是求从子节点到根节点的距离(自下而上),求高度一般是用后序遍历(层层向上返回当前的高度),求深度用前序遍历(是向下遍历)
cpp
int isbalance(TreeNode* root){
int result;
if (root==NULL) return 0;
int leftnum = isbalance(root->left);
if(leftnum==-1) return -1;
int rightnum = isbalance(root->right);
if(rightnum==-1) return -1;
if (abs(leftnum - rightnum) > 1) { // 中
result = -1;
} else {
result = 1 + max(leftnum, rightnum); // 以当前节点为根节点的树的最大高度
}
return result;
}
bool isBalanced(TreeNode* root) {
return isbalance(root) == -1 ? false : true;
}
257. 二叉树的所有路径
看完想法:注意遇到叶子节点的终止方式,以及回溯的时刻
cpp
void traversal(TreeNode* root, vector<int>& path, vector<string>& result){
path.push_back(root->val);
if(root->left ==NULL && root->right ==NULL) {
//找到了叶子节点,此时开始执行回溯
string spath;
for(int i=0; i< path.size() -1; i++){
spath += to_string(path[i]); //在C++ 11中有这个函数
spath+= "->"; //因为要加箭头,所以for循环只到倒数第二个
}
spath += to_string(path[path.size()-1]);
result.push_back(spath);
return ;
}
if(root->left){
traversal(root->left, path, result);
path.pop_back(); //需要返回上面一个节点
}
if(root->right){
traversal(root->right, path, result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
404.左叶子之和
看完想法:左叶子的明确定义:**节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。**不能通过遍历到该节点判断是否是叶子节点,而是应该通过父节点判断子节点是否是叶子节点
cpp
int sumOfLeftLeaves(TreeNode* root) {
if(root==NULL) return 0;
int leftvalue = sumOfLeftLeaves(root->left);
if(root->left!=NULL && root->left->left == NULL && root->left->right == NULL) leftvalue+=root->left->val;
int rightvalue = sumOfLeftLeaves(root->right);
int sum = leftvalue + rightvalue ;
return sum;
}