Bladeren bron

Adding solution for 965

Vinicius Teshima 1 maand geleden
bovenliggende
commit
556d6cc149
1 gewijzigde bestanden met toevoegingen van 122 en 0 verwijderingen
  1. 122 0
      C/965.c

+ 122 - 0
C/965.c

@@ -0,0 +1,122 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+struct TreeNode {
+    int val;
+    struct TreeNode *left;
+    struct TreeNode *right;
+};
+
+/**
+ * Definition for a binary tree node.
+ * struct TreeNode {
+ *     int val;
+ *     struct TreeNode *left;
+ *     struct TreeNode *right;
+ * };
+ */
+bool isUnivalTree(struct TreeNode *root) {
+    int v = root->val;
+
+    struct TreeNode *nodes[124] = {0};
+    int size = 0;
+
+    if ( root->left != NULL ) nodes[size++] = root->left;
+    if ( root->right != NULL ) nodes[size++] = root->right;
+
+    for ( int i = 0; i < size; ++i ) {
+        struct TreeNode *r = nodes[i];
+        if ( r->val != v ) { return false; }
+        if ( r->left != NULL ) nodes[size++] = r->left;
+        if ( r->right != NULL ) nodes[size++] = r->right;
+    }
+
+    return true;
+}
+
+char *
+treenode_to_cstr(const struct TreeNode *root)
+{
+    char *data = 0;
+    unsigned long cap = 1024;
+    unsigned long size = 0;
+
+    if ( root == NULL ) {
+        char *data = calloc(4, sizeof(char));
+        return memcpy(data, "nil", 3);
+    }
+
+    data = calloc(cap, sizeof(*data));
+
+    // TreeNode(%d, R, R)
+    data[size++] = 'T';
+    data[size++] = 'r';
+    data[size++] = 'e';
+    data[size++] = 'e';
+    data[size++] = 'N';
+    data[size++] = 'o';
+    data[size++] = 'd';
+    data[size++] = 'e';
+    data[size++] = '(';
+    if ( root->val > 99 ) { data[size++] = ((root->val / 100) % 10) + '0'; }
+    if ( root->val > 9 ) { data[size++] = ((root->val / 10) % 10) + '0'; }
+    data[size++] = (root->val % 10) + '0';
+    data[size++] = ',';
+    data[size++] = ' ';
+
+    char *l = treenode_to_cstr(root->left);
+    unsigned long lsize = strlen(l);
+    if ( size+lsize >= cap ) {
+        while (size+lsize >= cap) cap *= 2;
+        data = realloc(data, cap);
+    }
+    for ( unsigned int i = 0; i < lsize; ++i ) { data[size++] = l[i]; }
+    free(l);
+    data[size++] = ',';
+    data[size++] = ' ';
+
+    char *r = treenode_to_cstr(root->right);
+    unsigned long rsize = strlen(r);
+    if ( size+rsize >= cap ) {
+        while (size+rsize >= cap) cap *= 2;
+        data = realloc(data, cap);
+    }
+    for ( unsigned int i = 0; i < rsize; ++i ) { data[size++] = r[i]; }
+    free(r);
+
+    data[size++] = ')';
+    return data;
+}
+
+
+void
+r(struct TreeNode *root, bool exp)
+{
+
+    char *root_cstr = treenode_to_cstr(root);
+    printf("isUnivalTree(%s) = %b | exp: %b\n", root_cstr, isUnivalTree(root), exp);
+    free(root_cstr);
+}
+
+int
+main(void)
+{
+    struct TreeNode t1ll = {1, NULL, NULL};
+    struct TreeNode t1lr = {1, NULL, NULL};
+    struct TreeNode t1l = {1, &t1ll, &t1lr};
+    struct TreeNode t1rr = {1, NULL, NULL};
+    struct TreeNode t1r = {1, NULL, &t1rr};
+    struct TreeNode t1 = {1, &t1l, &t1r};
+    r(&t1, true);
+
+    struct TreeNode t2ll = {5, NULL, NULL};
+    struct TreeNode t2lr = {2, NULL, NULL};
+    struct TreeNode t2l = {2, &t2ll, &t2lr};
+    struct TreeNode t2r = {2, NULL, NULL};
+    struct TreeNode t2 = {2, &t2l, &t2r};
+    r(&t2, false);
+
+    return 0;
+}