使用 C++ 计算二叉树中的好节点
c++server side programmingprogramming
假设我们有一棵二叉树,树中的节点 X 被命名为好节点,因为从根到 X 的路径中没有节点的值大于 X。在这里,我们必须找到二叉树中好节点的数量。
因此,如果输入如下,
则输出将为 4,彩色节点为好节点。
为了解决这个问题,我们将遵循以下步骤 −
定义一个函数 dfs(),它将获取节点, val,
如果节点为空,则 −
返回
ret := ret + (当 val <= 节点的 val 时为 1,否则为 0)
dfs(节点左侧、val 的最大值和节点的 val)
dfs(节点右侧、val 的最大值和节点的 val)
从主方法执行以下操作 −
ret := 0
dfs(root, -inf)
return 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