在 C++ 中计算单值子树
c++server side programmingprogramming
假设我们有一棵二叉树;我们必须计算单值子树的数量。这里的单值子树表示子树的所有节点都具有相同的值。
因此,如果输入类似 root = [5,1,5,5,5,null,5],
则输出为 4
要解决这个问题,我们将遵循以下步骤 −
定义一个函数solve(),它将接受节点,
如果节点为空,则 −
返回 true
left := 解决(节点左侧)
右 := 解决(节点右侧)
如果左侧为假或右侧为假,则 −
返回 false
如果节点左侧存在且节点的 val 不等于节点左侧的值,则 −
返回 false
如果节点右侧存在且节点的 val 不等于节点右侧的值,则 −
返回 false
(将 ret 增加 1)
返回true
从 main 方法执行以下操作 −
ret := 0
solve(root)
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; bool solve(TreeNode* node){ if (!node || node->val == 0) return true; bool left = solve(node->left); bool right = solve(node->right); if (!left || !right) return false; if (node->left && node->left->val != 0 && node->val != node->left->val) return false; if (node->right && node->right->val != 0 && node->val != node->right->val) return false; ret++; return true; } int countUnivalSubtrees(TreeNode* root){ ret = 0; solve(root); return ret; } }; main(){ Solution ob; vector<int< v = {5,1,5,5,5,NULL,5}; TreeNode *root = make_tree(v); cout << (ob.countUnivalSubtrees(root)); }
输入
{5,1,5,5,5,NULL,5}
输出
4