二叉樹學習筆記 深度和寬度

2021-07-04 16:43:35 字數 1762 閱讀 5435

二叉樹這種資料結構的重要性不必多言,下面計算二叉樹的深度和寬度。要計算二叉樹的深度和寬度,先構造一課二叉樹,為了方便驗證結果的正確性,在這裡構造二叉搜尋樹。二叉樹由節點構成,所以先實現節點類:

template class stnode;

template //初始化nodevalue的值為item,三個指標均為null

stnode::stnode(const t& item=t()):nodevalue(item)

先說計算深度,這裡引用一種《資料結構c++語言描述--應用stl模板庫》這本書中的計算方法,採用的是遞迴的思想,即採用後序遍歷二叉樹,分別計算左子節點和右子節點的深度,取其中較大值加上1就得到自己的深度。比如下面的二叉樹

計算a節點的深度首先計算左右子節點bc的深度,同理計算b節點的深度先計算左右子節點de的深度。定義乙個null節點的深度為-1,這樣乙個葉節點的深度就為0(取左右子節點的深度,均為-1,再加上1)。這樣d節點的左右子節點的深度分別為-1和0,取較大值加上1,那麼d的深度就為1,b的左右子節點的深度分別為1和0,取較大值加上1,b的深度就為2,。這樣一層一層遞迴到根節點就得出了整個二叉樹的深度。

int dep(stnode* root)

return totaldep;//返回二叉樹的深度

}

測試一下是否正確

void main()

depth++; //p往q中插值進行了一次,深度加1

/*有時候p恰好是最後一層,即取出的元素的左右子節點均為空,這時q中沒有元素,那麼就跳出迴圈,

否則下面的depth++會多執行一次,沒有在上面的while迴圈前面加這句話的原因是:下面的while迴圈

取出了q中的所有元素,所以q必為空,此時如果p也為空,那麼就會跳出整個大的while迴圈*/

if(q.empty())

break;

while(!q.empty())

depth++; //q往p中插值進行了一次,深度加1

} return depth;

}

測試一下兩種計算深度方法的正確性 

void main()

if(q.size()>width) //記錄q的size,如果大於width,那麼就將q.size()賦值給width

width=q.size();

while(!q.empty())

}return width; //這樣,width中存放的是pq的size值中的最大值,也就是二叉樹的寬度

}

測試一下

結果正確。

二叉樹的寬度和深度

遞迴版本 public static intgetdeep treenode root 非遞迴版本 思想 二叉樹的深度就是指二叉樹有幾層,那麼我們可以使用層序遍歷來實現。public static intgetdeep treenode root if p.right null 如果下一層沒有結點,...

二叉樹的寬度和深度

1.二叉樹的寬度 若某一層的節點數不少於其他層次的節點數,那麼該節點數即為二叉樹的寬度。在訪問過程中,我們只需要將同一層中的節點同時入棧即可。為此,我們也只需要知道上一層佇列中元素的多少,在將該queue中所有元素出佇列的同時,將下一層的元素進佇列,完成交接。這樣,便可以清晰地知道每一層中節點的多少...

二叉樹的深度 二叉樹的深度 二叉樹最大寬度

題目 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。例如 給定二叉樹 3,9,20,null,null,15,7 返回它的最大深度 3 根節點加上左右子樹的最大深度就是樹的最大深度。如下 class solution ...