965.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. struct TreeNode {
  6. int val;
  7. struct TreeNode *left;
  8. struct TreeNode *right;
  9. };
  10. /**
  11. * Definition for a binary tree node.
  12. * struct TreeNode {
  13. * int val;
  14. * struct TreeNode *left;
  15. * struct TreeNode *right;
  16. * };
  17. */
  18. bool isUnivalTree(struct TreeNode *root) {
  19. int v = root->val;
  20. struct TreeNode *nodes[124] = {0};
  21. int size = 0;
  22. if ( root->left != NULL ) nodes[size++] = root->left;
  23. if ( root->right != NULL ) nodes[size++] = root->right;
  24. for ( int i = 0; i < size; ++i ) {
  25. struct TreeNode *r = nodes[i];
  26. if ( r->val != v ) { return false; }
  27. if ( r->left != NULL ) nodes[size++] = r->left;
  28. if ( r->right != NULL ) nodes[size++] = r->right;
  29. }
  30. return true;
  31. }
  32. char *
  33. treenode_to_cstr(const struct TreeNode *root)
  34. {
  35. char *data = 0;
  36. unsigned long cap = 1024;
  37. unsigned long size = 0;
  38. if ( root == NULL ) {
  39. char *data = calloc(4, sizeof(char));
  40. return memcpy(data, "nil", 3);
  41. }
  42. data = calloc(cap, sizeof(*data));
  43. // TreeNode(%d, R, R)
  44. data[size++] = 'T';
  45. data[size++] = 'r';
  46. data[size++] = 'e';
  47. data[size++] = 'e';
  48. data[size++] = 'N';
  49. data[size++] = 'o';
  50. data[size++] = 'd';
  51. data[size++] = 'e';
  52. data[size++] = '(';
  53. if ( root->val > 99 ) { data[size++] = ((root->val / 100) % 10) + '0'; }
  54. if ( root->val > 9 ) { data[size++] = ((root->val / 10) % 10) + '0'; }
  55. data[size++] = (root->val % 10) + '0';
  56. data[size++] = ',';
  57. data[size++] = ' ';
  58. char *l = treenode_to_cstr(root->left);
  59. unsigned long lsize = strlen(l);
  60. if ( size+lsize >= cap ) {
  61. while (size+lsize >= cap) cap *= 2;
  62. data = realloc(data, cap);
  63. }
  64. for ( unsigned int i = 0; i < lsize; ++i ) { data[size++] = l[i]; }
  65. free(l);
  66. data[size++] = ',';
  67. data[size++] = ' ';
  68. char *r = treenode_to_cstr(root->right);
  69. unsigned long rsize = strlen(r);
  70. if ( size+rsize >= cap ) {
  71. while (size+rsize >= cap) cap *= 2;
  72. data = realloc(data, cap);
  73. }
  74. for ( unsigned int i = 0; i < rsize; ++i ) { data[size++] = r[i]; }
  75. free(r);
  76. data[size++] = ')';
  77. return data;
  78. }
  79. void
  80. r(struct TreeNode *root, bool exp)
  81. {
  82. char *root_cstr = treenode_to_cstr(root);
  83. printf("isUnivalTree(%s) = %b | exp: %b\n", root_cstr, isUnivalTree(root), exp);
  84. free(root_cstr);
  85. }
  86. int
  87. main(void)
  88. {
  89. struct TreeNode t1ll = {1, NULL, NULL};
  90. struct TreeNode t1lr = {1, NULL, NULL};
  91. struct TreeNode t1l = {1, &t1ll, &t1lr};
  92. struct TreeNode t1rr = {1, NULL, NULL};
  93. struct TreeNode t1r = {1, NULL, &t1rr};
  94. struct TreeNode t1 = {1, &t1l, &t1r};
  95. r(&t1, true);
  96. struct TreeNode t2ll = {5, NULL, NULL};
  97. struct TreeNode t2lr = {2, NULL, NULL};
  98. struct TreeNode t2l = {2, &t2ll, &t2lr};
  99. struct TreeNode t2r = {2, NULL, NULL};
  100. struct TreeNode t2 = {2, &t2l, &t2r};
  101. r(&t2, false);
  102. return 0;
  103. }