2016微軟探星 | Full Binary Tree Picture

承接上一篇文章,題目同樣來(lái)自2016微軟探星夏令營(yíng)在線技術(shù)筆試球化。這道題主要考察的是樹(shù)的構(gòu)建與遍歷众旗。


題目:
時(shí)間限制:10000ms
單點(diǎn)時(shí)限:1000ms
內(nèi)存限制:256MB

描述
Let's draw a picture of full binary tree using ASCII characters. In this picture nodes are represented by '#'. A parent node connects its left child by '/' and its right child by ''.
For the sake of aesthetic, the nodes of the same height must be painted on the same line. And the nodes must be perfectly connected by '/' and ''. Intersections or misplacements are not allowed.
For example, this is the full binary tree of height 2:

  # 
 / \
#  #

This is the full binary tree of height 3:

   #
  / \
 /   \
 #    #
/ \  / \
#  # # #

This is the full binary tree of height 4:

        # 
       / \
      /   \
     /     \
    /       \
   /         \ 
   #         # 
  / \       / \ 
 /   \     /   \ 
 #   #     #    # 
/ \ / \    / \  / \
# # # #    # #  # #

Now we build a Cartesian coordinate system for the picture. We make the root at the origin (0, 0). The positive direction of x is to the bottom and the positive direction of y is to the right.
The full binary tree of height 2 is illustrated as below.

0 
+-----+--------> y
|
0+    #(0,0)
|    / \
|   #   # 
|(2,-2) (2,2)
| 
v
x

Given the height of the tree and a rectangle area of the picture, your task is to find out the amount of nodes in such area. For example, assuming the height of tree is 2, the left-top corner of the rectangle area is at (0, 0) and the right-bottom corner is at (2, 2), then the area contains 2 nodes (the root and its right child) totally.
輸入
The first line contains two integers N and M.
N is the height of the full binary tree. M is the number of queries. (1 ≤ N≤ 20, 1 ≤ M≤ 100)Each query consists of 4 integers x1, y1, x2 and y2. (x1, y1) is the left-top corner of the area and (x2,y2) is the right-bottom corner of the area.
輸出
For each query output the amount of nodes in the area.

樣例輸入

2 3
0 0 0 0
0 0 2 2
0 -2 2 2

樣例輸出

1

2
3

解釋:
題目描述了一種用ASCII碼繪制的滿二叉樹(shù)夕土,然后將樹(shù)的根設(shè)置在一個(gè)特殊坐標(biāo)軸的原點(diǎn)(0埠戳,0)井誉,坐標(biāo)軸x向下為正向,y向右是正向整胃。樹(shù)的每個(gè)樹(shù)枝與節(jié)點(diǎn)都占用1*1的大小】攀ィ現(xiàn)在需要求在坐標(biāo)軸中任意畫(huà)一個(gè)矩形,里面會(huì)有多少個(gè)樹(shù)的節(jié)點(diǎn)屁使。例如樣例輸入中在岂,對(duì)于(0,0)與(2蛮寂,2)形成的矩形里面蔽午,包含有根節(jié)點(diǎn)和它的右葉子節(jié)點(diǎn),所以輸出的是2共郭。

分析:
1祠丝、這是是一個(gè)二叉樹(shù)的問(wèn)題,肯定要構(gòu)造樹(shù)結(jié)構(gòu)除嘹,為了簡(jiǎn)單写半,這里就聲明一個(gè)Node的結(jié)構(gòu)體,通過(guò)結(jié)構(gòu)體指針來(lái)構(gòu)建樹(shù)尉咕。代碼如下:

struct Node {
    Node *lchild, *rchild;
    long px, py;
    Node(long _px, long _py)
    {
        lchild = rchild = NULL;
        px = _px;
        py = _py;
    }
};

px叠蝇,py是節(jié)點(diǎn)的坐標(biāo),lchild與rchild分別對(duì)應(yīng)左右子節(jié)點(diǎn)年缎。

2悔捶、接下里就是生成樹(shù),這里輸入就是樹(shù)的高度单芜,我們就根據(jù)高度來(lái)生成滿二叉樹(shù)蜕该。生成的時(shí)候根據(jù)題目規(guī)則,我們需要注意樹(shù)的樹(shù)枝占位情況洲鸠。通過(guò)分析我們可以得出堂淡,高度為1的節(jié)點(diǎn),它一邊的樹(shù)枝數(shù)量是0扒腕,高度2的為1绢淀,高度3的為2,其它高度的節(jié)點(diǎn)樹(shù)枝數(shù)量是其子節(jié)點(diǎn)數(shù)量的2倍加1瘾腰。這樣我們可以用個(gè)遞歸實(shí)現(xiàn)皆的。代碼如下:

long stickNumWithHeight(int height)
{
    if (height == 1) {
        return 0;
    }
    if (height == 2) {
        return 1;
    }
    if (height == 3) {
        return 2;
    }
    return stickNumWithHeight(height - 1) * 2 + 1;
}

void buildTreeWithHeight(Node &node, int height)
{
    if (height == 1) {
        return;
    }
    long step = stickNumWithHeight(height) + 1;
    node.lchild = new Node(node.px + step, node.py - step);
    node.rchild = new Node(node.px + step, node.py + step);
    buildTreeWithHeight(*node.lchild, height-1);
    buildTreeWithHeight(*node.rchild, height-1);
}

3、樹(shù)生成過(guò)后蹋盆,我們只需要對(duì)每個(gè)矩形遍歷檢測(cè)這棵樹(shù)费薄,就可得到在當(dāng)前矩形中節(jié)點(diǎn)數(shù)量,代碼如下:

int checkNodeInArea(Node &node, int x1, int y1, int x2, int y2)
{
    int sum = 0;
    if (node.px >= x1 && node.py >= y1 && node.px <= x2 && node.py<= y2) {
        sum += 1;
    }
    if (node.lchild != NULL) {
        sum += checkNodeInArea(*node.lchild,x1,y1,x2,y2);
    }
    if (node.rchild != NULL) {
        sum += checkNodeInArea(*node.rchild,x1,y1,x2,y2);
    }
    return sum;
}

判定結(jié)果:


完整代碼:

//
//  main.cpp
//  Full Binary Tree Picture
//
//  Created by Jiao Liu on 8/5/16.
//  Copyright ? 2016 ChangHong. All rights reserved.
//

#include <iostream>
#include <math.h>

using namespace std;

struct Node {
    Node *lchild, *rchild;
    long px, py;
    Node(long _px, long _py)
    {
        lchild = rchild = NULL;
        px = _px;
        py = _py;
    }
};

long stickNumWithHeight(int height)
{
    if (height == 1) {
        return 0;
    }
    if (height == 2) {
        return 1;
    }
    if (height == 3) {
        return 2;
    }
    return stickNumWithHeight(height - 1) * 2 + 1;
}

void buildTreeWithHeight(Node &node, int height)
{
    if (height == 1) {
        return;
    }
    long step = stickNumWithHeight(height) + 1;
    node.lchild = new Node(node.px + step, node.py - step);
    node.rchild = new Node(node.px + step, node.py + step);
    buildTreeWithHeight(*node.lchild, height-1);
    buildTreeWithHeight(*node.rchild, height-1);
}

int checkNodeInArea(Node &node, int x1, int y1, int x2, int y2)
{
    int sum = 0;
    if (node.px >= x1 && node.py >= y1 && node.px <= x2 && node.py<= y2) {
        sum += 1;
    }
    if (node.lchild != NULL) {
        sum += checkNodeInArea(*node.lchild,x1,y1,x2,y2);
    }
    if (node.rchild != NULL) {
        sum += checkNodeInArea(*node.rchild,x1,y1,x2,y2);
    }
    return sum;
}

int main(int argc, const char * argv[]) {
    int N,M;
    scanf("%d %d",&N,&M);
    Node *root = new Node(0,0);
    buildTreeWithHeight(*root,N);
    while (M--) {
        int x1,y1,x2,y2;
        scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
        int amout = checkNodeInArea(*root,x1,y1,x2,y2);
        cout<<amout<<endl;
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栖雾,一起剝皮案震驚了整個(gè)濱河市义锥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岩灭,老刑警劉巖拌倍,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異噪径,居然都是意外死亡柱恤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門找爱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梗顺,“玉大人,你說(shuō)我怎么就攤上這事车摄∷掳” “怎么了仑鸥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)变屁。 經(jīng)常有香客問(wèn)我眼俊,道長(zhǎng),這世上最難降的妖魔是什么粟关? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任疮胖,我火速辦了婚禮,結(jié)果婚禮上闷板,老公的妹妹穿的比我還像新娘澎灸。我一直安慰自己,他們只是感情好遮晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布性昭。 她就那樣靜靜地躺著,像睡著了一般县遣。 火紅的嫁衣襯著肌膚如雪巩梢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天艺玲,我揣著相機(jī)與錄音括蝠,去河邊找鬼。 笑死饭聚,一個(gè)胖子當(dāng)著我的面吹牛忌警,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秒梳,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼法绵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了酪碘?” 一聲冷哼從身側(cè)響起朋譬,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兴垦,沒(méi)想到半個(gè)月后徙赢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡探越,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年狡赐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦幔。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枕屉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鲤氢,到底是詐尸還是另有隱情搀擂,我是刑警寧澤西潘,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站哨颂,受9級(jí)特大地震影響喷市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咆蒿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一东抹、第九天 我趴在偏房一處隱蔽的房頂上張望蚂子。 院中可真熱鬧沃测,春花似錦、人聲如沸食茎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)别渔。三九已至附迷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哎媚,已是汗流浹背喇伯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拨与,地道東北人稻据。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像买喧,于是被迫代替她去往敵國(guó)和親捻悯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 人淤毛,從某個(gè)不經(jīng)意的瞬間悄悄地來(lái)今缚,在某個(gè)難以預(yù)料的時(shí)刻輕輕的去,這來(lái)去的中間低淡,有多少有用或無(wú)用的東西在內(nèi)心流淌...
    悄然Edward閱讀 318評(píng)論 0 7
  • 1.如何讓人感覺(jué)我的商品很好蔗蹋? 問(wèn):大濕事期,如何讓人感覺(jué)我的商品很好?答:貴一點(diǎn)纸颜。問(wèn):哦兽泣,你的意思是說(shuō)好貴好貴,好才...
    徐克惜愚兄弟閱讀 407評(píng)論 0 0
  • 我鉆進(jìn)一條山洞胁孙,去尋找我自以為是的夜空唠倦〕屏郏可是 黑暗中只有花香濃,凍結(jié)成了每一寸時(shí)空稠鼻,連飛蛾的振翅和蝙蝠的撲聲也那么...
    李一十八閱讀 264評(píng)論 0 1
  • 1冈止、道歉:并不總意味著你是錯(cuò)的,它只是意味著你更珍惜你們之間的關(guān)系候齿。 2熙暴、專一:不是一輩子只喜歡一個(gè)人,是喜歡一個(gè)...
    醫(yī)成道人閱讀 191評(píng)論 0 0