<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實(shí)戰(zhàn)222:完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù)

          共 4727字,需瀏覽 10分鐘

           ·

          2021-03-29 13:59

          算法的重要性,我就不多說(shuō)了吧,想去大廠,就必須要經(jīng)過(guò)基礎(chǔ)知識(shí)和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個(gè)公眾號(hào)后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問(wèn)題叫做 完全二叉樹(shù)的節(jié)點(diǎn)個(gè)數(shù),我們先來(lái)看題面:
          https://leetcode-cn.com/problems/count-complete-tree-nodes/

          According to Wikipedia, every level, except possibly the last, is completely filled in a complete binary tree, and all nodes in the last level are as far left as possible. It can have between 1 and 2h nodes inclusive at the last level h.


          完全二叉樹(shù) 的定義如下:在完全二叉樹(shù)中,除了最底層節(jié)點(diǎn)可能沒(méi)填滿外,其余每層節(jié)點(diǎn)數(shù)都達(dá)到最大值,并且最下面一層的節(jié)點(diǎn)都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~ 2h 個(gè)節(jié)點(diǎn)。

          示例


          解題

          https://blog.csdn.net/qq_42033567/article/details/115052155

          對(duì)于這道題目,我們可以使用深度優(yōu)先遍歷或者廣度優(yōu)先遍歷來(lái)計(jì)算二叉樹(shù)的節(jié)點(diǎn)數(shù)。

          1)深度優(yōu)先遍歷: 深度優(yōu)先遍歷就很簡(jiǎn)單了,題中傳入的是二叉樹(shù),需要返回的是二叉樹(shù),所以可以直接進(jìn)行遞歸計(jì)算二叉樹(shù)的節(jié)點(diǎn)數(shù):
          如果子樹(shù)為空節(jié)點(diǎn)數(shù)為 0
          如果子樹(shù)存在左子樹(shù)或右子樹(shù)則節(jié)點(diǎn)數(shù)+1,繼續(xù)遞歸分別求左子樹(shù)節(jié)點(diǎn)數(shù)和右子樹(shù)節(jié)點(diǎn)數(shù)

          時(shí)間復(fù)雜度:O(n),其中n是二叉樹(shù)的節(jié)點(diǎn)數(shù),我們需要遍歷一遍整個(gè)二叉樹(shù);
          空間復(fù)雜度:O(h),其中h是二叉樹(shù)的高度,遞歸的時(shí)間復(fù)雜度為O(h)。

          /**
           * Definition for a binary tree node.
           * function TreeNode(val, left, right) {
           * this.val = (val===undefined ? 0 : val)
           * this.left = (left===undefined ? null : left)
           * this.right = (right===undefined ? null : right)
           * }
           */
          /**
           * @param {TreeNode} root
           * @return {number}
           */
          var countNodes = function(root) {
              if(!root){
                  return 0
              }
              return 1 + countNodes(root.left) + countNodes(root.right)
          }


          2)廣度優(yōu)先遍歷: 廣度優(yōu)先遍歷往往是初始化一個(gè)對(duì)來(lái)保存當(dāng)前層的節(jié)點(diǎn),在對(duì)當(dāng)前層的節(jié)點(diǎn)進(jìn)行操作。對(duì)于這題目,我們只需要在節(jié)點(diǎn)進(jìn)入隊(duì)列的時(shí)候,結(jié)果加一即可。

          時(shí)間復(fù)雜度:O(n),其中n是二叉樹(shù)的節(jié)點(diǎn)數(shù),我們需要遍歷一遍整個(gè)二叉樹(shù);
          空間復(fù)雜度:O(n),其中n是隊(duì)列的長(zhǎng)度,我們需要將每一層都放在隊(duì)列中。

          /**
           * Definition for a binary tree node.
           * function TreeNode(val, left, right) {
           * this.val = (val===undefined ? 0 : val)
           * this.left = (left===undefined ? null : left)
           * this.right = (right===undefined ? null : right)
           * }
           */

          /**
           * @param {TreeNode} root
           * @return {number}
           */

          var countNodes = function(root) {
              if(!root){
                  return 0
              }

              let queue = [root]
              let res = 1
              while(queue.length){
                  let node = queue.shift()
                  if(node.left){
                      queue.push(node.left)
                      res++
                  }
                  if(node.right){
                      queue.push(node.right)
                      res++
                  }
              }
              return res
          };


          3)二分法
          上面的兩種方法的時(shí)間復(fù)雜度都是O(n),下面用二分法來(lái)解決,時(shí)間復(fù)雜度會(huì)降低。
          我們知道,對(duì)于一個(gè)完全二叉樹(shù),它的所有子樹(shù)都是完全二叉樹(shù),有的子樹(shù)是滿二叉樹(shù),滿二叉樹(shù)的的節(jié)點(diǎn)個(gè)數(shù)計(jì)算公式如下:2-1,其中h為當(dāng)前樹(shù)的高度。
          那什么情況下就是滿二叉樹(shù)呢,我們知道,二叉樹(shù)中有個(gè)樹(shù)的深度的概念,指的就是根節(jié)點(diǎn)到這個(gè)節(jié)點(diǎn)所經(jīng)歷的邊的個(gè)數(shù), 所以我們只需要判斷左右子樹(shù)的高度手否相等來(lái)判斷當(dāng)前樹(shù)是不是滿二叉樹(shù)。
          如果不是滿二叉樹(shù),那就是規(guī)模小一點(diǎn)的完全二叉樹(shù),就進(jìn)行遞歸處理。

          時(shí)間復(fù)雜度:每次遞歸調(diào)用對(duì)應(yīng)了一層樹(shù)高,調(diào)用logN次,每次調(diào)用計(jì)算完全二叉樹(shù)的高度需要O(logN),所以時(shí)間復(fù)雜度為O(logN)
          空間復(fù)雜度:O(1),我們只需要維護(hù)有限的額外空間。


          /**
           * Definition for a binary tree node.
           * function TreeNode(val, left, right) {
           * this.val = (val===undefined ? 0 : val)
           * this.left = (left===undefined ? null : left)
           * this.right = (right===undefined ? null : right)
           * }
           */

          /**
           * @param {TreeNode} root
           * @return {number}
           */

          var countNodes = function(root) {
              if(!root){
                  return 0
              }

              let leftHeight = 0, rightHeight = 0
              let leftNode = root, rightNode = root

              while(leftNode){
                  leftHeight++
                  leftNode = leftNode.left
              }
              while(rightNode){
                  rightHeight++
                  rightNode = rightNode.right
              }

              if(leftHeight === rightHeight){
                  return 2 ** leftHeight - 1
              }
              return 1 + countNodes(root.left) + countNodes(root.right)
          };


          好了,今天的文章就到這里,如果覺(jué)得有所收獲,請(qǐng)順手點(diǎn)個(gè)在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動(dòng)力 。

          上期推文:

          LeetCode1-220題匯總,希望對(duì)你有點(diǎn)幫助!

          LeetCode刷題實(shí)戰(zhàn)221:最大正方形


          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩高清无码小电影 | 亚洲综合系列 | 日韩中文字幕有码 | 91成人做爰A片无遮挡直播 | 无码V∧|