В этом вопросе пришел этот вопрос. Представление обхода двоичного дерева. Распечатайте все возможные бинарные деревья из него.печать всех двоичных деревьев от обхода порядка
Первоначальная мысль:
Если у нас есть только два элемента в массиве. Скажем 2,1. Тогда два возможных дерева
2
\
1
1
/
2
Если 3 элемента скажет, 2,1,4. Тогда у нас есть 5 возможных деревьев.
2 1 4 2 4
\ /\ / \ /
1 2 4 1 4 2
\ / / \
4 2 1 1
Итак, в принципе, если у нас есть n элементов, то у нас есть n-1 ветви (childs,/or). Мы можем организовать эти n-1 ветки в любом порядке. Для n = 3, n-1 = 2. Итак, у нас есть две ветви. Мы можем организовать 2 филиала следующими способами:
/ \ \ / /\
/ \ / \
Первоначальная попытка:
struct node *findTree(int *A,int l,int h)
{
node *root = NULL;
if(h < l)
return NULL;
for(int i=l;i<h;i++)
{
root = newNode(A[i]);
root->left = findTree(A,l,i-1);
root->right = findTree(A,i+1,h);
printTree(root);
cout<<endl;
}
}
В ваших примерах с (1, 2, 4), должен ли последний пример быть 4-1-2 сверху вниз? –
@ChuckBlumreich массив равен 2,1,4. я думаю, цифры верны. –
Интересный вопрос, но я не уверен в ваших диаграммах. Я интерпретирую «по порядку» обход «посещать левых детей, посещать узел, посещать правых детей» (контрастировать с предварительным визитом «N», посещать L, посещать R »и« послепродажный »визит L, посещать R, посещать N '). Если это так, то два дерева для пары '(2, 1)' являются '(root = 2, R child = 1)' как показано на рисунке и '(left child = 2, root = 1)', что не является что вы нарисовали диаграммой. У меня есть аналогичные опасения по поводу более сложных диаграмм, но я, возможно, полностью недооцениваю что-то. –