Bu soruya bir röportajda rastladım. Bir ikili ağacın geçişi sırasına göre verilmiştir. Olası tüm ikili ağaçları ondan yazdır.Tüm ikili ağaçların inorder geçişinden yazdırılması
İlk düşünce:
biz dizideki sadece 2 unsurları var derseniz. 2,1 de. Daha sonra iki olası ağaç
2
\
1
1
/
2
3 elemanları ki halinde
, 2,1,4 bulunmaktadır. Sonra 5 olası ağaç var.2 1 4 2 4
\ /\ / \ /
1 2 4 1 4 2
\ / / \
4 2 1 1
Demek ki n unsurlar var temelde, o zaman n-1 şubeleri var (oğul,/veya). Bu n-1 şubelerini herhangi bir sırada düzenleyebiliriz. n = 3 için, n-1 = 2. Yani, 2 şubemiz var. Biz bu yolla 2 şube sağlayabilir:
/ \ \ / /\
/ \ / \
İlk girişimi:
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;
}
}
Örneklerinizde (1, 2, 4), son örnek yukarıdan aşağıya 4-1-2 olmalıdır? –
@ChuckBlumreich dizisi 2,1,4. Sanırım rakamlar doğru .. –
İlginç bir soru, ama ben senin şemalarından emin değilim. 'Sırasıyla çocukları ziyaret et', 'düğümü ziyaret et, doğru çocukları ziyaret et' olarak yorumlama yapıyorum (ön sipariş 'N'yi ziyaret et, L'yi ziyaret et, R'yi ziyaret et ve siparişi ver' ziyareti L, ziyareti R ziyaret et N '). Eğer bu doğruysa, o zaman iki ağaç için (2, 1) '' (root = 2, R child = 1) 'şeklinde gösterilir ve' (sol child = 2, root = 1) 'dır. ne çizdiğini. Daha karmaşık diyagramlar hakkında benzer endişelerim var, ama bir şeyi yanlış anlamış olabilirim. –