leetcode1448好节点深刻理解DFS+BFS
- DFS
- 没有返回值
max在递归时要慎重用引用,因为在回溯时可能不能改变max;
因为节点的值可能有负数,所以最大值从根节点开始,根节点一定是好节点。
int goodNum=0; void dfs(TreNode* root,int max){ if(!root)return ; if(root->val>=max){ goodNum++; max=root->val; } dfs(root->left,max); dfs(root->right,max); } dfs(root,root->val); return goodNuml;
-
- 有返回值
int dfs(TreeNode* root,int max_data){ if(!root)return 0; int goodNum=root->val>=max_data?1:0; if(goodNum)max_data=root->val; goodNum+=dfs(root->left,max_data);//左子树的好节点个数 goodNum+=dfs(root->right,max_data);//右子树好节点个数,因为前期的好节点个数要累加,因此要一直加goodNum return goodNum;总的个数 } int goodNodes(TreeNode* root) { return dfs(root,root->val); } //算最大深度 int MaxDepth(TreeNode* root){ if(!root)return 0; return max(MaxDepth(root->left),MaxDepth(root->right))+1;//左子树和右子树的最大深度加一 }
- BFS
queue<TreeNode*>nodeQueue; queue<int>goodNode; nodeQueue.push(root); goodNode.push(root->val); while(!nodeQueue.empty()){ TreeNode* node=nodeQueue.front();nodeQueue.pop(); int max_data=goodNode.front();goodNode.pop(); if(node->left){ TreeNode* left=node->left; nodeQueue.push(left); goodNode.push(max(max_data,left->val));//保证每次记录的max_data都是存的是上一层的最大值 if(node->lright){ TreeNode* right=node->right; nodeQueue.push(right); goodNode.push(max(max_data,right->val)); } }