1. 程式人生 > 其它 >Leetcode222.完全二叉樹的節點個數 Count Complete Tree Nodes(Java)

Leetcode222.完全二叉樹的節點個數 Count Complete Tree Nodes(Java)

技術標籤:刷題二叉樹leetcode

Leetcode222.完全二叉樹的節點個數 Count Complete Tree Nodes(Java)

##Binary Search##, ##Tree##

完全二叉樹的節點個數

可直接採用DFS或BFS方法求出總的結點總數

DFS

採用後續遍歷,先計算左右兩子樹的總結點數,考慮到還有未被計算的根節點,返回總結點數 + 1

時間複雜度: O(n)

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        return
countNodes(root.left) + countNodes(root.right) + 1; } }

二分搜尋

完全二叉樹:若設二叉樹的深度為k,除第k層外,其他各層(1 ~ k - 1)的結點數都達到最大個數,且第k層的所有結點都連續集中在最左邊,就是完全二叉樹

img

滿二叉樹:一顆二叉樹的結點要麼是葉子結點,要麼它有兩個子結點(如果一個二叉樹的層數為k,且結點總數時(2^k)-1,則它是滿二叉樹。

img

對於任意一棵完全二叉樹都可以這樣遞迴

  • 該完全二叉樹是滿二叉樹,計算從該樹根節點一直向左和一直向右的高度,當兩高度相等h時說明這棵樹是滿二叉樹,則該樹的結點總數為(2^h) - 1
  • 該樹不是滿二叉樹,即左右兩高度不相等,此時必定滿足這樣一個性質:該樹根節點的左子樹和右子樹必然有一棵是滿二叉樹
    • 左邊是滿二叉樹
    • 右邊是滿二叉樹
    • 對於左右兩棵子樹,滿二叉樹的結點數可以根據(2^h) - 1計算得到,對於非滿二叉樹的完全二叉樹,其結點數可以採用同樣的方式遞迴計算

時間複雜度: O(logn * logn)
每次判斷左右兩邊深度為O(logn),總共需要判斷O(logn)次

class Solution {
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        int
x = 1, y = 1; TreeNode l = root, r = root; while (l.left != null) { x ++; l = l.left; } while (r.right != null) { y ++; r = r.right; } if (x == y) return (1 << x) - 1; return countNodes(root.left) + countNodes(root.right) + 1; } }