在訪談中遇到了這個問題。 給定一個二叉樹的遍歷。從中打印所有可能的二叉樹。打印所有遍歷中的二叉樹
最初的想法:
如果說我們只有2個元素在數組中。說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個分支(孩子,/或)。 我們可以按任意順序排列這些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;
}
}
在你的例子中(1,2,4),最後的例子應該是從上到下的4-1-2嗎? – 2012-01-03 23:40:24
@ChuckBlumreich數組是2,1,4。我猜這些數字是正確的.. – 2012-01-03 23:42:22
有趣的問題,但我不確定你的圖。我正在解釋'按順序'遍歷爲'訪問離開的孩子,訪問節點,訪問正確的孩子'(與預訂'訪問N,訪問L,訪問R'和訪問後'訪問L,訪問R,訪問N')。如果這是正確的,那麼對'(2,1)'的兩棵樹就是'(root = 2,R child = 1)'和'(左邊的孩子= 2,根= 1)',這不是你已經畫出了什麼。我對更復雜的圖表有類似的擔憂,但我可能完全誤解了一些東西。 – 2012-01-03 23:51:33