У меня есть следующая функция для печати деревьев в порядке, который работает должным образом:
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;
}
}
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);
}
}
Также обратите внимание, что это напечатает дерево в обходе предварительного заказа.
Это правильный способ сделать это:
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);
}
}
Что вы хотите сделать в Предварительный заказ версия:
так должно выглядеть так:
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);
}
}
}
Я знаю, что это лет, но все еще полезно!
Я задавался вопросом, как сделать это сам, и нашел этот вопрос, но понимаю, что есть простой ответ:
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
Отказаться.