1. 程式人生 > 其它 ><資料結構>XDOJ314.完全二叉樹的子樹

<資料結構>XDOJ314.完全二叉樹的子樹

問題與解答

問題描述
對一棵完全二叉樹,採用自上而下、自左往右的方式從1開始編號,我們已知這個二叉樹的最後一個結點是n,現在的問題是結點m所在的子樹一共包括多少個結點?
輸入格式
輸入資料包括多行,每行給出一組測試資料,包括兩個整數m,n (1 <= m <= n <= 1000000000)。0 0表示輸入結束。
輸出格式
對於每一組測試資料,輸出一行,該行包含一個整數,給出結點m所在子樹中包括的結點的數目。
樣例輸入
3 12
0 0
樣例輸出
4

#include<stdio.h>
#include<queue>      //佇列
using namespace std;
int main()
{
    int m,n,x,num;
    queue<int> Q; //建立佇列儲存子樹結點
    while(scanf("%d%d", &m,&n)!=EOF && m && n)  //多點測試
    {
        num = 0;
        Q.push(m); //加入第一個結點
        num++;     //sum++
        while(1)
        {
            /*取出當前結點*/
            x = Q.front();
            Q.pop();
            /*添加當前結點的子樹結點*/
            if(2*x <= n)   {Q.push(2*x);   num++;} //每新增一個結點sum++
            else break;
            if(2*x+1 <= n) {Q.push(2*x+1); num++;}
            else break;
        }
        while(!Q.empty()) Q.pop();  //不要忽略
        printf("%d\n", num);
    }
}

題後反思: 本質是BFS

  1. 這題的本質是遍歷結點
  2. 遍歷有兩種實現方式:BFS\DFS
    • BFS: 利用 佇列 暫存元素
    • DFS: 利用 棧 暫存元素
  3. 這題原解法的實質就是BFS, 而且不難知道,這題也可以用DFS(遞迴)求解,不過這往往涉及樹的二叉連結串列實現,會比較繁瑣