222. 完全二叉樹的節(jié)點個數

給出一個完全二叉樹,求出該樹的節(jié)點個數。

說明:

完全二叉樹的定義如下:在完全二叉樹中披坏,除了最底層節(jié)點可能沒填滿外,其余每層節(jié)點數都達到最大值盐数,并且最下面一層的節(jié)點都集中在該層最左邊的若干位置棒拂。若最底層為第 h 層,則該層包含 1~ 2h 個節(jié)點玫氢。

示例:

輸入: 
    1
   / \
  2   3
 / \  /
4  5 6

輸出: 6

解題思路以及知識點:

  1. 暴力簡單方法之DFS和BFS遍歷所有結點帚屉,計算節(jié)點數。
  2. 利用完全二叉樹特殊特點漾峡,減少對所以有節(jié)點的遍歷攻旦。

方法一:BFS或DFS

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
let count=0;
var countNodes = function(root) {
    count=0;
    dfs(root)
    return count;
};
function dfs(root){
    if(root===null){
        return
    }
    count++
    dfs(root.left)
    dfs(root.right)
}

方法二:位操作判斷左右,二分查找尋找最末端節(jié)點生逸。

  1. 將完全二叉樹的左孩子標記0牢屋,右孩子標記1 如下[1,2,3,4,5,6]節(jié)點。則可將路徑的二進制碼當成當前節(jié)點的編號槽袄,即節(jié)點1為(1)烙无,節(jié)點2為(10),節(jié)點3為(11)遍尺,節(jié)點4為(100)截酷,節(jié)點5為(101),節(jié)點6為(110)以此類推狮鸭,節(jié)點n的路徑可根據n的二進制編碼取得合搅。
  2. 完全二叉樹特性,可根據深度level確定所有葉子節(jié)點n的取值范圍即:(1<<level)<=n<=(1<<level+1).eg:當level=2時歧蕉,葉子節(jié)點的編號值大于等于4灾部,小于等于7.
  3. 通過二分查找,尋找葉子節(jié)點的編號之為k惯退。對k的二進制位進行操作赌髓,根據位的0或1確定路徑向右還是向左。eg:6(110)若判斷判斷二進制第二位的值,則可110&10(6&4)锁蠕,若>0則取右孩子夷野,<0則取左孩子。
  4. 最終二分查找確定的值即為最后一個葉子節(jié)點荣倾,編號即為節(jié)點個數悯搔。
         1(1)
        /   \
    2(0)       3(1)
 /       \      /
4(0)     5(1)  6(0)
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var countNodes = function(root) {
    if(root===null){
        return 0
    }
    let level=0,temp=root.left
    while(temp){
        level++;
        temp=temp.left
    }
    let low=1<<level,high=(1<<level+1)-1,mid
    while(low<high){
        mid=Math.floor((high-low+1)/2)+low
        if(exits(root,level,mid)){
            low=mid
        }else{
            high=mid-1
        }
    }
    return low
};
function exits(root,level,k){
    let bit=1<<(level-1),temp=root
    while(bit){
        if(bit&k){
            temp=temp.right
        }else{
            temp=temp.left
        }
        bit=bit>>1
    }
    return temp!==null
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舌仍,隨后出現的幾起案子妒貌,更是在濱河造成了極大的恐慌,老刑警劉巖铸豁,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灌曙,死亡現場離奇詭異,居然都是意外死亡节芥,警方通過查閱死者的電腦和手機在刺,發(fā)現死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來头镊,“玉大人蚣驼,你說我怎么就攤上這事∨≡危” “怎么了隙姿?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厂捞。 經常有香客問我输玷,道長,這世上最難降的妖魔是什么靡馁? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任欲鹏,我火速辦了婚禮,結果婚禮上臭墨,老公的妹妹穿的比我還像新娘赔嚎。我一直安慰自己,他們只是感情好胧弛,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布尤误。 她就那樣靜靜地躺著,像睡著了一般结缚。 火紅的嫁衣襯著肌膚如雪损晤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天红竭,我揣著相機與錄音尤勋,去河邊找鬼喘落。 笑死,一個胖子當著我的面吹牛最冰,可吹牛的內容都是我干的瘦棋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼暖哨,長吁一口氣:“原來是場噩夢啊……” “哼赌朋!你這毒婦竟也來了?” 一聲冷哼從身側響起篇裁,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤箕慧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茴恰,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡斩熊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年往枣,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粉渠。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡分冈,死狀恐怖,靈堂內的尸體忽然破棺而出霸株,到底是詐尸還是另有隱情雕沉,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布去件,位于F島的核電站坡椒,受9級特大地震影響,放射性物質發(fā)生泄漏尤溜。R本人自食惡果不足惜倔叼,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宫莱。 院中可真熱鬧丈攒,春花似錦、人聲如沸授霸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碘耳。三九已至显设,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間藏畅,已是汗流浹背敷硅。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工功咒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绞蹦。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓力奋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親幽七。 傳聞我的和親對象是個殘疾皇子景殷,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內容