题目描述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著做权归领扣网络全部。商业转载请联系官方受权,非商业转载请注明出处。