題目描述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著做權歸領釦網絡全部。商業轉載請聯繫官方受權,非商業轉載請註明出處。