每日演算法之求完全二叉樹的結點個數

2021-09-03 01:44:26 字數 1019 閱讀 4845

參考 leetcode 222題

題目:求乙個完全二叉樹的結點總數

解析:要解決這道題,必須要清楚完全二叉樹的特點

完全二叉樹:除了最後一層,所有層的節點數達成最大,與此同時,最後一層的所有結點都在左側。

滿二叉樹:所有層的結點數都達到最大

解法一:遞迴法1.計算出左子樹和右子樹的高度h

2.如果左子樹和右子樹的高度一樣,則它是一棵滿二叉樹,結點個數就是(2^h)-1個

3.如果高度不一樣,就要遞迴分別求出左子樹和右子樹的結點數。結點總數=左子樹+右子樹+1(根節點)

public int countnodes(treenode root) 

return left == right ? (1 << height ) - 1 : 1 + countnodes(root.left) + countnodes(root.right);

}

解法二:迭代法1.先計算出樹的高度h和計算右子樹的高度

2.比較右子樹是否和樹的高度小1來判斷,左子樹和右子樹是不是有相同的高度

3.如果高度相同,那麼樹的最後一行的最後乙個節點在右子樹中,而左子樹是高度為h-1的整棵樹。所以我們取左子樹的2^h-1節點數加上右子樹中的遞迴節點數+1(根節點)

4.如果高度不同,那麼最後一行樹的最後乙個節點在左子樹中,而右子樹是高度為h-2的整棵樹。所以我們取右子樹的2^(h-1)-1節點加上左子樹中的遞迴節點數+1(根節點)。

public int countnodes2(treenode root) else

h--;

} return nodes;

}private int height(treenode root)

每日演算法之求完全二叉樹的結點個數

參考 leetcode 222題 題目 求乙個完全二叉樹的結點總數 解析 要解決這道題,必須要清楚完全二叉樹的特點 完全二叉樹 除了最後一層,所有層的節點數達成最大,與此同時,最後一層的所有結點都在左側。滿二叉樹 所有層的結點數都達到最大 解法一 遞迴法1.計算出左子樹和右子樹的高度h 2.如果左子...

222 完全二叉樹的結點個數

完全二叉樹和滿二叉樹的區別 如果二叉樹中除去最後一層節點為滿二叉樹,且最後一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。由於題中已經告訴我們這是一顆完全二叉樹,我們又已知了完全二叉樹除了最後一層,其他層都是滿的,並且最後一層的節點全部靠向了左邊。那我們可以想到,可以將該完全二叉樹可以分割成...

求完全二叉樹的節點個數

題目 給定乙個完全二叉樹的頭結點,求節點的個數。要求時間複雜度低於o n 思路 利用完全二叉樹的特點,分別求出左右子樹的高度l1,r1,如果l1 r1,則左子樹是滿二叉樹,根據高度直接求出節點 個數,接著遞迴右子樹。同理如果l1 r1,則右子樹是滿二叉樹,直接得到右子樹的節點個數,遞迴左子樹。pub...