用 C++ 计算二叉树中的优质节点
假设我们有一棵二叉树,树中某个节点 X 被称为优质节点,当从根节点到节点 X 的路径上没有值为大于 X 的节点时。这里我们要找出二叉树中的优质节点数量。
所以,如果输入如下,
那么输出将为 4,着色的节点是优质节点。
要解决这个问题,我们将采取以下步骤:
定义一个函数 dfs(),它将接收 node、val,
如果 node 为 null,那么:
返回
ret := ret + (当 val <= node 的 val 时为 1,否则为 0)
dfs(node 的左节点,val 和 node val 的最大值)
dfs(node 的右节点,val 和 node val 的最大值)
在主方法中执行以下操作:
ret := 0
dfs(根节点,-inf)
返回 ret
示例
让我们看看以下实现,以获得更深入的理解:
#include <bits/stdc++.h> using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int data){ val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val){ queue<TreeNode*> q; q.push(*root); while(q.size()){ TreeNode *temp = q.front(); q.pop(); if(!temp->left){ if(val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; }else{ q.push(temp->left); } if(!temp->right){ if(val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; }else{ q.push(temp->right); } } } TreeNode *make_tree(vector<int> v){ TreeNode *root = new TreeNode(v[0]); for(int i = 1; i<v.size(); i++){ insert(&root, v[i]); } return root; } class Solution { public: int ret; void dfs(TreeNode* node, int val){ if (!node) return; ret += val <= node->val; dfs(node->left, max(val, node->val)); dfs(node->right, max(val, node->val)); } int goodNodes(TreeNode* root){ ret = 0; dfs(root, INT_MIN); return ret; } }; main(){ Solution ob; vector<int> v = {3,1,4,3,NULL,1,5}; TreeNode *root = make_tree(v); cout << (ob.goodNodes(root)); }
输入
{3,1,4,3,NULL,1,5}
输出
4
广告