Как передать команду или argoman процессу в Java

Неочищенный путь:

  • В каждом узле X = find, если любой из n1, n2 существует в левой части узла Y = find, если любой из n1, n2 существует на правая сторона узла, если сам узел равен n1 || n2, мы можем назвать это либо найденным слева, либо справа для целей обобщения. Если оба X и Y истинны, то узел является CA

. Проблема с вышеописанным методом заключается в том, что мы будем делать «нахождение» несколько раз, т. Е. Существует возможность каждый узел проходит несколько раз. Мы можем преодолеть эту проблему, если мы сможем записать информацию, чтобы не обрабатывать ее снова (подумайте о динамическом программировании).

Чтобы вместо этого найти каждый узел, мы сохраняем запись о том, что уже было найдено.

Лучший способ:

  • Мы проверяем, есть ли для данного узла, если left_set (что означает, что n1 | n2 найдено в левом поддереве) или right_set в глубине первая мода. (ПРИМЕЧАНИЕ. Мы даем самому корню свойство left_set, если оно либо n1 | n2)
  • Если и left_set, и right_set, то узел является LCA.

Код:

struct Node *
findCA(struct Node *root, struct Node *n1, struct Node *n2, int *set) {
   int left_set, right_set;
   left_set = right_set = 0;
   struct Node *leftCA, *rightCA;
   leftCA = rightCA = NULL;

   if (root == NULL) {
      return NULL;
   }
   if (root == n1 || root == n2) {
      left_set = 1;
      if (n1 == n2) {
         right_set = 1;
      }
   }

   if(!left_set) {
      leftCA = findCA(root->left, n1, n2, &left_set);
      if (leftCA) {
         return leftCA;
      }
   }
   if (!right_set) {
      rightCA= findCA(root->right, n1, n2, &right_set);
      if(rightCA) {
         return rightCA;
      }
   }

   if (left_set && right_set) {
      return root;
   } else {
      *set = (left_set || right_set);
      return NULL;
   }
}
1
задан sajad 9 September 2010 в 12:36
поделиться