<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)110:平衡二叉樹(shù)

          共 3638字,需瀏覽 8分鐘

           ·

          2020-11-30 22:35

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

          今天和大家聊的問(wèn)題叫做?平衡二叉樹(shù),我們先來(lái)看題面:
          https://leetcode-cn.com/problems/balanced-binary-tree/
          Given a binary tree, determine if it is height-balanced.

          For this problem, a height-balanced binary tree is defined as:

          a binary tree in which the left and right subtrees of every node differ in height by no more than 1.

          題意


          給定一個(gè)二叉樹(shù),判斷它是否是高度平衡的二叉樹(shù)。
          本題中,一棵高度平衡二叉樹(shù)定義為:
          一個(gè)二叉樹(shù)每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹(shù)的高度差的絕對(duì)值不超過(guò) 1 。

          樣例

          解題

          https://blog.csdn.net/qq_17550379/article/details/82081501

          對(duì)于這個(gè)問(wèn)題,我們可以非常快的寫(xiě)出遞歸版本。當(dāng)root為空的時(shí)候,我們將None也看成是一棵二叉樹(shù),所以返回True。接著我們判斷左子樹(shù)高度和右子樹(shù)高度差是不是大于1,如果是,那么我們返回False就好啦。如果不是接著遞歸判斷左子樹(shù)和右子樹(shù)是不是一棵平衡二叉樹(shù)。

          class?Solution:????????
          ????def?isBalanced(self, root):
          ????????"""
          ????????:type root: TreeNode
          ????????:rtype: bool
          ????????"""

          ????????if?not?root:
          ????????????return?True

          ????????def?height(node):
          ????????????if?not?node:
          ????????????????return?0

          ????????????return?max(height(node.left), height(node.right)) + 1

          ????????if?abs(height(root.left) - height(root.right)) > 1:
          ????????????return?False

          ????????return?self.isBalanced(root.left) and?self.isBalanced(root.right)


          但是如你所見(jiàn),這個(gè)解法有一個(gè)很明顯的弊端,就是我們?cè)诿看吻骽eight的時(shí)候有大量的重復(fù)運(yùn)算,我們?cè)趺纯梢员苊膺@種重復(fù)運(yùn)算呢?或者說(shuō)我們有什么辦法在遍歷一遍樹(shù)(求一次height)的過(guò)程中就可以得到答案呢?我們希望當(dāng)左右子樹(shù)中存在不平衡的時(shí)候就可以提前停止。

          class?Solution:????????
          ????def?isBalanced(self, root):
          ????????"""
          ????????:type root: TreeNode
          ????????:rtype: bool
          ????????"""

          ????????def?height(node):
          ????????????if?not?node:
          ????????????????return?0

          ????????????left = height(node.left)
          ????????????right = height(node.right)
          ????????????if?left == -1?or?right == -1?or?abs(left - right) > 1:
          ????????????????return?-1

          ????????????return?max(left, right) + 1
          ????????
          ????????return?height(root) != -1


          上面這種解法非常的巧妙,當(dāng)樹(shù)出現(xiàn)不平衡的時(shí)候,我們令樹(shù)的高度是-1。

          同樣的,對(duì)于可以用遞歸解決的問(wèn)題,我們都應(yīng)該思考一下怎么可以通過(guò)迭代去解決。那這個(gè)問(wèn)題怎么通過(guò)迭代解決呢?我們可以先通過(guò)BFS得到一個(gè)list,然后從list的最后一個(gè)節(jié)點(diǎn)回退到root,并且計(jì)算節(jié)點(diǎn)的深度差,更新各節(jié)點(diǎn)深度。

          class Solution:
          ????def isBalanced(self, root):
          ????????"""
          ????????:type?root:?TreeNode
          ????????:rtype: bool
          ????????"""
          ????????nodes = [root]
          ????????for?node in nodes:
          ????????????if?node:
          ????????????????nodes.extend([node.left, node.right])

          ????????depths = {}
          ????????nodes.reverse()
          ????????for?node in nodes:
          ????????????if?node:
          ????????????????if?abs(depths.get(node.left, 0) - depths.get(node.right, 0)) > 1:
          ????????????????????return?False

          ????????????????depths[node] = max(depths.get(node.left, 0), depths.get(node.right, 0)) + 1

          ????????return?True



          我們也可以通過(guò)前序遍歷的方式去更新節(jié)點(diǎn)的深度。但是這里的問(wèn)題和之前的Leetcode 144:二叉樹(shù)的前序遍歷中有一些區(qū)別,之前的問(wèn)題中是輸出節(jié)點(diǎn),而我們這里是要更新節(jié)點(diǎn)。所以我們不能直接將節(jié)點(diǎn)彈出,而是要保留到更新完節(jié)點(diǎn)后再?gòu)棾觥_@要怎么做呢?我們可以通過(guò)建立一個(gè)tuple包含一個(gè)seen信息,表示這個(gè)節(jié)點(diǎn)之前是不是訪問(wèn)過(guò)。如果訪問(wèn)過(guò)我們?cè)賹⒐?jié)點(diǎn)彈出,否則的話再將節(jié)點(diǎn)插回去。

          class Solution:
          ????def isBalanced(self, root):
          ????????"""
          ????????:type?root:?TreeNode
          ????????:rtype: bool
          ????????"""
          ????????stack = list()
          ????????stack.append((root, 0))
          ????????depths = {}
          ????????while?stack:
          ????????????node, seen = stack.pop()
          ????????????if?node:
          ????????????????if?not seen:
          ????????????????????stack.extend([(node, 1), (node.right, 0), (node.left, 0)])
          ????????????????if?abs(depths.get(node.left,0) - depths.get(node.right,0)) > 1:
          ????????????????????return?False
          ????????????????depths[node] = max(depths.get(node.left,0), depths.get(node.right,0)) + 1

          ????????return?True


          依照這種思路,我們也可以寫(xiě)出中序遍歷和后序遍歷的版本。

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

          更多推文:

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

          LeetCode刷題實(shí)戰(zhàn)101:對(duì)稱(chēng)二叉樹(shù)

          LeetCode刷題實(shí)戰(zhàn)102:二叉樹(shù)的層序遍歷

          LeetCode刷題實(shí)戰(zhàn)103:二叉樹(shù)的鋸齒形層次遍歷

          LeetCode刷題實(shí)戰(zhàn)104:二叉樹(shù)的最大深度

          LeetCode刷題實(shí)戰(zhàn)105:從前序與中序遍歷序列構(gòu)造二叉樹(shù)

          LeetCode刷題實(shí)戰(zhàn)106:從中序與后序遍歷序列構(gòu)造二叉樹(shù)
          LeetCode刷題實(shí)戰(zhàn)107:二叉樹(shù)的層次遍歷 II
          LeetCode刷題實(shí)戰(zhàn)108:將有序數(shù)組轉(zhuǎn)換為二叉搜索樹(shù)
          LeetCode刷題實(shí)戰(zhàn)109:有序鏈表轉(zhuǎn)換二叉搜索樹(shù)

          瀏覽 52
          點(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>
                  少妇骚逼| 国在线播放 | 亚洲视频欧美色图 | 一级黄色片成年人电影 | 国产欧美一级 |