题目:
解答:
方法一:深度优先搜索
思路与算法:
我们先进行一次深度优先搜索,获取这颗树中的所有节点的值。然后,就可以判断所有节点的值是不是都相等了。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isUnivalTree(TreeNode* root) 13 { 14 vector <int> ret; 15 if (NULL == root) 16 { 17 return true; 18 } 19 20 dfs(root, ret); 21 22 int i = 1; 23 for (i = 1; i < ret.size(); i++) 24 { 25 if (ret[i] != ret[i - 1]) 26 { 27 return false; 28 } 29 } 30 31 return true; 32 } 33 34 void dfs(TreeNode *root, vector<int> &ret) 35 { 36 if (root) 37 { 38 ret.push_back(root->val); 39 dfs(root->left, ret); 40 dfs(root->right, ret); 41 } 42 } 43 };
方法二:递归
思路与算法:
一颗树是单值的,当且仅当根节点的子节点所在的子树也是单值的,同时根节点的值与子节点的值相同。
我们可以使用递归实现这个判断的过程。left_correct 表示当前节点的左孩子是正确的,也就是说:左孩子所在的子树是单值的,并且当前节点的值等于左孩子的值。right_correct 对当前节点的右孩子表示同样的事情。递归处理之后,当根节点的这两种属性都为真的时候,我们就可以判定这颗二叉树是单值的。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isUnivalTree(TreeNode* root) 13 { 14 bool left_correct = (root->left == NULL || 15 (root->val == root->left->val && isUnivalTree(root->left))); 16 bool right_correct = (root->right == NULL || 17 (root->val == root->right->val && isUnivalTree(root->right))); 18 return left_correct && right_correct; 19 } 20 };