參考 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...