在面试中遇到了这个问题。给定一个二叉树的中序遍历,输出所有可能的二叉树。
初始想法:
如果说数组中只有2个元素,比如2,1。那么可能的树有两种:
2
\
1
1
/
2
如果有三个元素,分别为2、1和4,则有5种可能的树形结构。
2 1 4 2 4
\ / \ / \ /
1 2 4 1 4 2
\ / / \
4 2 1 1
基本上,如果我们有n个元素,那么我们就有n-1个分支(子节点、/或)。我们可以以任何顺序排列这n-1个分支。 对于n=3,n-1=2。所以我们有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;
}
}
(2,1)
的两棵树来说,它们的结构应该是(根=2,右子节点=1)
如图所示和(左子节点=2,根=1)
,而这不是你绘制的图表。 我对更复杂的图表也有类似的担忧,但我可能完全误解了某些东西。 - Jonathan Leffler