【leetcode】二叉树专项(二)

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;}

2.1302. 层数最深叶子节点的和

例子

设立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中使用全局变量的小技巧: 当在所有函数外进行变量的声明和赋值时,容易出现测试用例正确,提交时出错的情况,可以在所有函数外进行变量的声明,但在子函数中赋值。

参考:为什么 LeetCode 执行代码正确,提交出错? - 知乎 (zhihu.com)

3. 145. 二叉树的后序遍历

关键:传参

传入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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值