這是我的思路:
a,b)表示根節點
c)說明這是壹棵完整的二叉樹,少於最後壹層。
我覺得解決A和B的條件有很多方法,這裏最簡單的方法就是把每壹層從小到大排序。
因此,第壹步是對數組進行排序(快速排序,插入排序.....任何種類)在nlgn。
第二步是完全二叉樹的插入方法,可以通過水平遍歷來擴展,這裏就不細說了。
第三步,統計葉節點值,輸出葉節點值(這個太簡單了,只輸出左右為空的節點。)
完整代碼:
忽略排序步驟。
# include & ltiostream & gt
# include & lt隊列& gt
使用?命名空間?std
struct?結節
{
int?價值;
節點*?左;
節點*?對;
node(int?val):value(val),left(NULL),right(NULL){}
};
struct?樹
{
節點*?根;
Tree():root(NULL){}
};
節點*?HorizInsert(node*?根,節點*?z)
{
如果(!根)
{
root = z;
回歸?根;
}
隊列& ltnode * & gt?q;
q.push(根);
而(!q.empty())
{
節點*?front = q . front();
q . pop();
if(Front-& gt;left==NULL)
{
正面-& gt;左= z;
回歸?根;
}
if(Front-& gt;right==NULL)
{
正面-& gt;右= z;
回歸?根;
}
if(Front-& gt;左)
q . push(Front-& gt;左);
if(Front-& gt;右)
q . push(Front-& gt;對);
}
回歸?根;
}
作廢?HorizPrint(node*?根)
{
如果(!root)?回歸?;
隊列& ltnode * & gt?q;
q.push(根);
int?calc = 0;
cout & lt& lt“那個?葉子:“;
而(!q.empty())
{
節點*?front = q . front();
q . pop();
如果(!正面-& gt;向左?& amp& amp?!正面-& gt;右)
{
++ calc;
cout & lt& lt正面-& gt;價值& lt& lt'?';
}
if(Front-& gt;左)
q . push(Front-& gt;左);
if(Front-& gt;右)
q . push(Front-& gt;對);
}
cout & lt& ltendl & lt& lt“Ther?號碼?的?葉子:?”& lt& ltcalc & lt& ltendl
}
作廢?主()
{
int?Array[]={1,2,3,4,5,6,7,8,9,10,11 };
int?len = sizeof(Array)/sizeof(Array[0]);
樹*?t =新?樹;
for(int?I = 0;我& ltlen++i)
t->;root = HorizInsert(T-& gt;根,新的?node(Array[I]);
HorizPrint(T-& gt;根);
}