1.剑指 Offer II 054. 所有大于等于节点的值之和
由于给出的树为搜索二叉树,其
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
故一路遍历到最右节点即为其最大节点,最大节点 返回上一节点 的左节点 即为第二大的节点
故遍历顺序为:
re(root->left); 操作结构体;re(root->right);
操作结构体:声明一个公共变量int n;
在main()中赋值为0;
可在re()中直接使用
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int n;
struct TreeNode* re(struct TreeNode* root){
if(root!=NULL){
re(root->right);
n += root->val;
root->val=n;
re(root->left);
}
return root;
}
struct TreeNode* convertBST(struct TreeNode* root){
n =0;
re(root,n);
return root;}
例子
设立dep与maxdep,其中dep表示当前层数(从0开始) ,maxdep表示当前经过的最大层数,并令一个int total=当前节点数,,当dep未到达最大层时,maxdep总小于dep,即dep与 total会随dep的增大而变化,故条件为(dep>maxdep)操作为:maxdep=dep,total=node->val;//更新maxdep与加和起点total,当dep到达最大后,maxdep不再变化,故此事当dep等于maxdep时,说明当前处于最大层,即total+=node->val;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int maxdep;
int total;
void dfs(struct TreeNode* node, int dep) {
if (!node) {
return;
}
//printf("dep:%d ",dep);
// printf("maxdep:%d ",maxdep);
if (dep > maxdep) {
maxdep = dep;
total = node->val;
}
else if (dep == maxdep) {
total += node->val;
}
dfs(node->left, dep + 1);
dfs(node->right, dep + 1);
}
int deepestLeavesSum(struct TreeNode* node){
maxdep = -1;
total = 0;
dfs(node, 0);
return total;
}
dep与maxdep的变化轨迹:
dep:0 maxdep:-1 dep:1 maxdep:0 dep:2 maxdep:1 dep:3 maxdep:2 dep:2 maxdep:3 dep:1 maxdep:3 dep:2 maxdep:3 dep:3 maxdep:3
一个在leetcode中使用全局变量的小技巧: 当在所有函数外进行变量的声明和赋值时,容易出现测试用例正确,提交时出错的情况,可以在所有函数外进行变量的声明,但在子函数中赋值。
关键:传参
传入int*n的参数,可以随被调用函数改变n的值
void post(struct TreeNode* root, int*f,int* n){
if(root!=NULL){
post(root->left,f,n);
post(root->right,f,n);
f[(*n)++]=root->val;
}
}
int* postorderTraversal(struct TreeNode* root, int* n){
*n=0;
int* f=(int*)malloc(201*sizeof(int));
post(root,f,n);
return f;
}
4. 94. 二叉树的中序遍历
void re(struct TreeNode* root,int *w, int* n){
if(root==NULL){
return ;
}
re(root->left,w,n);
w[(*n)++]=root->val;
re(root->right,w,n);
}
int* inorderTraversal(struct TreeNode* root, int* n){
*n=0;
int* w=(int*)malloc(200*sizeof(int));
re(root,w,n);
return w;
}