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

题目描述

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

 

示例

输入: 

          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实现。

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

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

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

 

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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2019-10-19 15:39  DiKa  阅读(686)  评论(0编辑  收藏  举报