C语言递归之在每一个树行中找最大值

题目描述node

您须要在二叉树的每一行中找到最大的值。数组

 

示例网络

输入: 

          1
         / \
        3   2
       / \   \  
      5   3   9 

输出: [1, 3, 9]

 

题目要求异步

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     struct TreeNode *left;
 6  *     struct TreeNode *right;
 7  * };
 8  */
 9 
10 
11 /**
12  * Note: The returned array must be malloced, assume caller calls free().
13  */
14 int* largestValues(struct TreeNode* root, int* returnSize){
15 
16 }

 

题解函数

 1 int max(int a,int b){
 2     return a>b?a:b;
 3 }
 4 
 5 int work(struct TreeNode* r, int* ar, int f){
 6     ar[f]=max(ar[f],r->val);
 7     if(r->left==NULL&&r->right==NULL)return f+1;
 8     else if(r->left==NULL)return work(r->right,ar,f+1);
 9     else if(r->right==NULL)return work(r->left,ar,f+1);
10     else return max(work(r->left,ar,f+1),work(r->right,ar,f+1));
11 }
12 
13 int* largestValues(struct TreeNode* root, int* returnSize){
14     int *array=(int *)malloc(5000*sizeof(int));
15     for(int i=0;i<5000;i++)array[i]=-2147483648;
16     if(root==NULL){
17         *returnSize=0;
18         return array;
19     }
20     *returnSize=work(root,array,0);
21     return array;
22 }

 

1.递归学习

这道题用BFS逻辑比较简单可是须要消耗大量内存去存储节点值,我最近在学习DFS,因此就用DFS实现。spa

这道题用DFS思路,切入点不太好想出来。指针

分析逻辑是每搜索到一个节点,就将其节点值与返回数组对应位置的值进行比较,若对应位置无值则直接插入,若对应位置有值则填入更大者,对应位置的下标便是节点的深度。code

所以只要用深搜的思路遍历每个节点,遍历携带参数为节点深度,就能够用时间复杂度为O(n)解决此问题。blog

 

2.非指针变量的值

这道题一开始我遇到了一些困惑👇

 

 

 

 而后我就怀疑是否是 return max(work(r->left,ar,f+1),work(r->right,ar,f+1)) 的两个函数并行执行了致使数据访问和修改问题。

C语言是严格按顺序执行的,不用去质疑异步执行、同步执行的问题。

最后删去了第五行和第六行之间的 if(ar[f]==NULL){ar[f]=r->val;} 才解决,经过输出中间结果我才了解到,0被看成NULL了。

 

3.数组初始化

 数组的初始化不仅是为其申请内存空间 int *array=(int *)malloc(5000*sizeof(int)) 

更要为其赋初值, for(int i=0;i<5000;i++)array[i]=-2147483648 

或者使用 #include<string.h> 的memset函数 memset(array, 0, 5000)

memset的用法: # include <string.h> void *memset(void *s, int c, unsigned long n); 

 

来源:力扣(LeetCode)

连接:https://leetcode-cn.com/problems/find-largest-value-in-each-tree-row著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。

相关文章
相关标签/搜索