печатать деревья в предзаказе через запятую

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

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);
}
}

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

Спасибо!

Обновить:

Функция предварительного заказа теперь работает, так это правильная функция предварительного заказа?

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

Решение

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);
}
}

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

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);
}
}
1

Ваш с целью версия:

  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

Я знаю, что это лет, но все еще полезно!

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

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Отказаться.

0
По вопросам рекламы [email protected]