1. 程式人生 > >樹——統計完全二叉樹的節點數目

樹——統計完全二叉樹的節點數目

題目要求

實現時間複雜度低於O(N)的解法。

遍歷整棵樹求節點個數時間複雜度為O(N)。

這裡利用了完全二叉樹的性質:通過比較左右子樹的最左結點的高度來看哪邊是滿的,然後遞迴計算。

1.首先遍歷左子樹最左節點找到二叉樹的層數h(頭節點在第1層);

2.遍歷右子樹最左節點看是否在第h層,若在第h層,說明左子樹該完全二叉樹左子樹是滿的;否則其右子樹是滿的,不過葉子節點都在第h-1層;

3.遞迴計算

//計算左子樹最左節點的層數
public int mostLeftLevel(TreeNode root)
{
	if(root == null)
		return 0;
	return mostLeftLevel(root.left)+1;
}
//遞迴計算完全二叉樹節點個數
public int countNodes(TreeNode root)
{
	if(root == null)
		return 0;
	int left=mostLeftLevel(root.left);
	int right=mostLeftLevel(root.right);
	if(left == right)//左子樹是滿的
		return (1<<left)+countNodes(root.right);
	else //right < left 右子樹是滿的,且層數少一層
		return (1<<right)+countNodes(root.left);
}


相關推薦

——統計完全節點數目

題目要求實現時間複雜度低於O(N)的解法。遍歷整棵樹求節點個數時間複雜度為O(N)。這裡利用了完全二叉樹的性質:通過比較左右子樹的最左結點的高度來看哪邊是滿的,然後遞迴計算。1.首先遍歷左子樹最左節點找

數據結構與算法(八)-(斜、滿完全、線索

大型 結點 develop pac string col 限制 也會 斐波那契數 前言:前面了解了樹的概念和基本的存儲結構類型及樹的分類,而在樹中應用最廣泛的種類是二叉樹 一、簡介   在樹型結構中,如果每個父節點只有兩個子節點,那麽這樣的樹被稱為二叉樹(Binary

基本概念(滿完全,滿的遍歷)

1. 二叉樹 二叉樹是每個節點最多有兩個子樹的樹結構。它有五種基本形態:二叉樹可以是空集;根可以有空的左子樹或右子樹;或者左、右子樹皆為空。 性質1:二叉樹第i層上的結點數目最多為 2{i-1} (i≥1)。性質2:深度為k的二叉樹至多有2{k}-1個結點(k≥1)

完全一些規律

1、二叉樹具有以下規律:       1)二叉樹高度為i所在的層至多有 個節點       2)高度為k的二叉樹至多有 -1個節點       3)對於任何一棵二叉樹,若度為2的

完全,滿排序,平衡,紅黑,B數,B-,B+,B*(一)

二叉樹 二叉樹:二叉樹是每個節點最多有兩個子樹的樹結構; 是n(n>=0)個結點的有限集合,它或者是空樹(n=0),或者是由一個根結點及兩顆互不相交的、分別稱為左子樹和右子樹的二叉樹所組成。 完全二叉樹 完全二叉樹:除最後一層外,每一層上的結點數均達到最

完全,滿排序,平衡,紅黑,B數,B-,B+,B*

二叉樹,完全二叉樹,滿二叉樹,二叉排序樹,平衡二叉樹,紅黑樹,B數,B-樹,B+樹,B*樹(一): BST樹 即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個兒子(Left和Right);        2.所有結點儲存一個關鍵字;       

:搜尋完全

搜尋二叉樹又叫作二叉樹查詢樹或者二叉排序樹, 所謂搜尋二叉樹是指對於任何一個結點,它的左子樹的所有結點都比這個根結點要小,它的右子樹的所有結點都比這個根結點要大。注意是根結點與左右子樹上所有的結點進行比較而不是僅僅與左右孩子結點進行比較,因此根據這個定義,那麼當按照中序

滿完全、平衡、哈夫曼

滿二叉樹:除了葉節點外每一個結點都有左右子女且葉節點都處在最底層的二叉樹。 這個滿二叉樹應該很好想象,就是一顆非常完美的樹,除了葉節點其他節點都有兩個孩子。 完全二叉樹:只有最下面的兩層結點度小於2,並且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。 也

滿完全、完美等概念的解釋

二叉樹:樹中每個節點至多有兩個子節點 二叉搜尋樹:對於樹中任何節點,如果其左子節點不為空,那麼該節點的value值永遠 >= 其左子節點;如果其右子節點不為空,那麼該節點的value值永遠 <= 其右子節點 滿二叉樹:樹中除了葉子節點,每個節點都

【C++】滿完全的區別及判斷

#include<iostream> #include<queue> using namespace std; struct BinaryTreeNode { char _data; BinaryTreeNode*_left; BinaryTreeNode*_right; Bi

完全判斷

分析:可以按照下面條件進行判斷  1. 採用按層遍歷的方式,依次遍歷所有結點  2. 如果當前結點有右孩子沒有左孩子,直接返回false  3. 如果當前結點有左孩子沒有右孩子,那之後的結點必須為葉子結點,否則返回false  4. 如果之前步

完美完全、完滿

1、二叉樹(Binary Tree) 1.1 什麼是二叉樹(Binary Tree) 每個結點至多擁有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。 1.2 二叉樹的性質 若二叉樹的層次從0開始,

線段完全

#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn=200000+10; struct node{ int s; int l,r; }; st

完全,滿,平衡的區別

度:指的是一個節點擁有子節點的個數。如二叉樹的節點的最大度為2。 深度:數的層數,根節點為第一層,依次類推。 葉子節點:度為0的節點,即沒有子節點的節點。 樹:樹中的每一個節點,可以有n(後續節點)個子節點,但是每個節點只有一個前驅節點。 二叉樹:除了葉子節點外,每個節點

、滿完全概念分清

自由樹 自由樹是一個連通的,無迴路的無向圖。 令G=(V,E)為一個無向圖。下面的表述是等價的。 1)        G是自由樹。 2)        G中任意兩個頂點由唯一一條簡單路徑得到。 3)        G是連通的,但從E中去掉任何邊後得到的圖都是非連通的。 4)

滿完全、最優(赫夫曼)、排序判定

二叉排序樹(Binary Sort Tree)又稱二叉查詢樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; (3)左、右子樹也分別為二叉排序樹;

自己動手作圖深入理解、滿完全

[toc] #### 一、背景 二叉樹是資料結構中的重點,也是難點。二叉樹是一種非線性結構,比陣列、棧、佇列等線性結構相比複雜度更高,想要做到心中有“樹”,需要自己動手畫圖、觀察、思考,才能領會其真諦。該文將會結合圖形,深入理解二叉樹、滿二叉樹及完全二叉樹的概念。 #### 二、基本概念 ##### 2.1

求解完全節點總數 Python實現

使用 特性 style most level nod 滿二叉樹 python實現 pan 1.利用一般遞歸即可求得 1 def getNodeNums(head): 2 if not head: 3 return 0 4 lnums = g

LeetCode222. Count Complete Tree Nodes (完全節點計數技巧)

Given a complete binary tree, count the number of nodes. Note: Definition of a complete binary tree from Wikipedia: In a complete binary tree

LeetCode演算法題——完全節點個數

對於這道題首先會想到遞迴判斷節點,不為空就加1,程式碼如下(但是會超時): //會超時 public class Solution { if (root == null) return 0; return CountNodes(root.left) + CountNodes(ro