2013-03-10 1 views
0

Я следующие функции для печати деревьев в порядке, который работает должным образом:печати деревья в предзаказа через запятую

void PrintInOrder(TTreeNode const * const pRoot) { 
    if (pRoot != 0) { 
     PrintInOrder(pRoot->pLeft); 
     if(pRoot->pLeft) std::cout << ","; 
     std::cout << pRoot->Data; 
     if(pRoot->pRight) std::cout << ","; 
     PrintInOrder(pRoot->pRight); 
    } 
} 

Это мой предзаказ печати функция:

void PrintPreOrder(TTreeNode const * const pRoot) { 
    if (pRoot != 0) { 
     std::cout << pRoot->Data << std::endl; 
     PrintPreOrder(pRoot->pLeft); 
     PrintPreOrder(pRoot->pRight); 
    } 
} 

Как я слишком глупо, чтобы понять, как напечатать его, разделив путь как функция порядка, я надеюсь, что вы, ребята, можете мне помочь!

спасибо!

Update:

функция Preorder теперь работает, так это правая функция postorder?

void PrintPostOrder(TTreeNode const * const pRoot) { 
     if (pRoot != 0) { 
      PrintPostOrder(pRoot->pLeft); 
      if(pRoot->pLeft) std::cout << ","; 
      PrintPostOrder(pRoot->pRight); 
      if(pRoot->pRight) std::cout << ","; 
      std::cout << pRoot->Data; 
     } 
} 
+0

Добро пожаловать в Переполнение стека. Пожалуйста, прочитайте [FAQ] до очень долгого времени. У вас есть 90% или более ответов в функции «PrintInOrder()». Адаптация к функциям 'PrintPreOrder()' и 'PrintPostOder()' является тривиальным упражнением в редактировании. –

ответ

1
void PrintPreOrder(TTreeNode const * const pRoot) { 
    if (pRoot != 0) { 
     std::cout << pRoot->Data << std::endl; 
     if(pRoot->pLeft || pRoot->pRight) std::cout << ","; 
     PrintPreOrder(pRoot->pLeft); 
     if(pRoot->pLeft && pRoot->pRight) std::cout << ","; 
     PrintPreOrder(pRoot->pRight); 
    } 
} 

Также обратите внимание, это будет печатать дерево в обходе.

+0

THX для вашей помощи, смешанный порядок и порядок в моем вопросе. – schreda

1

Это правильный способ сделать это:

void PrintPreOrder(TTreeNode const * const pRoot) { 
    if (pRoot != 0) { 
     std::cout << pRoot->Data << std::endl; 
     // take care of left node 
     if(pRoot->pLeft || pRoot->pRight) std::cout << ","; 
     PrintPreOrder(pRoot->pLeft); 
     // take care of right node 
     if(pRoot->pLeft && pRoot->pRight) std::cout << ","; 
     PrintPreOrder(pRoot->pRight); 
    } 
} 
0
Вашей в заказе версии:
  1. просмотров левого поддерева.
  2. Распечатывает данные корня.
  3. Посещение правой поддереве.
Что вы хотите сделать в предзаказа версия:
  1. печати данных в Рута.
  2. Посетите левое поддеворье.
  3. Перейти к правой подставке.

поэтому он должен выглядеть следующим образом:

void PrintPreOrder(TTreeNode const * const pRoot) { 
    if (pRoot) { 

     // print the root: 
     std::cout << pRoot->Data; 

     // visit the left subtree: 
     if (pRoot->pLeft) { 
      std::cout << ","; 
      PrintPreOrder(pRoot->pLeft); 
     } 

     // visit the right subtree: 
     if (pRoot->pRight) { 
      std::cout << ","; 
      PrintPreOrder(pRoot->pRight); 
     } 
    } 
} 
+0

, поэтому мне не нужны условия OR и AND, которые были опубликованы до того, как я думаю? – schreda

+0

@schreda: Это просто еще один способ выразить ту же логику. Если оставлено ИЛИ правильно, тогда будет напечатано 1 запятая, если будут и то, и 2 будут напечатаны запятые. Результат моего кода тот же :) – LihO

0

Я знаю, что это лет, но по-прежнему полезно!

мне было интересно, как сделать это сам, и нашел этот вопрос, но понять, что есть простой ответ:

void Preorder(Node* root){ 
    if(root==NULL){ 
    return; 
    } 
    cout << root->data << " "; 
    Preorder(root->left); 
    Preorder(root->right); 
} 

Вы начинаете с корнем дерева. Если корень null, код выполнен.

В противном случае распечатайте данные на этом узле.

Затем мы называем Preorder на left и right поддерева для этого узла, который в настоящее время root своего собственного поддерева. Важно сначала называть левое поддерево, так как это предзаказ (правое поддерево для пост-заказа).

Мы проверяем, если root является null, поэтому мы не должны беспокоиться, если левое поддерево null или right поддерево null индивидуально. Если узел null, просто откат.

Смежные вопросы