- 二叉树的所有路径
递归中稍稍带有一点回溯,理解了之后并不难。
回溯,其本质就是递归之后返回的过程。只是需要在返回后,重写一段逻辑。
(自己的理解:像是析构函数,在收回内存后,调用析构函数。而回溯,其实就是我们重写析构函数的过程。)
void callback(TreeNode* root, vector<int> &route, vector<string> &result){
if(!root) return;
route.push_back(root->val); //先根遍历,每遇到一个结点,就添加
callback(root->left, route, result);
callback(root->right, route, result);
if(!root->left && !root->right){ //回溯,遇到叶子节点,就删除,准备返回
string row_result = "";
for(auto i : route){
row_result += to_string(i);
}
result.push_back(row_result);
}
route.pop_back();
return ;
}
- 左叶子节点之和
int sumleaves(node* root){
if(!root) return 0;
int left = sumleaves(root->left);
int right = sumleaves(root->right); //后序遍历
//核心其实不在于处理左叶子节点,而是处理其父节点
if(root->left && !root->left->left && !root->left->right){
left += root->val;
}
return left + right;
}
- 平衡二叉树
自顶向下方法:
计算每个节点的高度,再使用先序遍历,向下递归如果遇到不平衡的子树,直接返回false,如果都遍历完成,返回true。
自底向上:
int ave(node* root){
if(!root) return 0;
int left = ave(root->left);
int right = ave(root->right);
if(abs(left-right)<=1 && left!=-1 && right!=-1){
return max(left, right) + 1;
}
else return -1;
}