日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树中最大/最小深度与叶子数

發布時間:2025/3/20 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树中最大/最小深度与叶子数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我們需要了解什么是“樹的深度”和“樹的葉子”。

樹的葉子:一棵樹當中沒有子結點(即度為0)的結點稱為葉子結點,簡稱“葉子”。?葉子是指度為0的結點,又稱為終端結點。

樹的深度:樹中最大的結點層。舉個例子:你爺爺是根節點,你爸爸叔叔是你爺爺的左/右孩子,你是你爸爸的左孩子。那么你爸爸叔叔的深度是2,你的深度是3。(夠通俗吧?)

首先我們來求樹的葉子數量,葉子的特征是沒有子節點。

思路:

1、判斷該節點左、右孩子是否都等于空,如果是:葉子數加一;如果不是:入棧

2、該節點等該節點的左子節點,重復步驟1,直到該節點等于空,執行步驟3。

3、如果棧非空:零時指針指向棧頂元素的右子節點,刪除棧頂元素;如果棧為空:執行完畢,退出。

具體代碼如下:

TEMPTYPE int CBinaryTree<type>::Leaves() {auto pStack = new stack<LPTREENODE>;auto nLeaves = 0, nCount = 0, nSize = Size();auto pTempTree = m_pTree;while (true){while (pTempTree){if (!pTempTree->m_pLeftChild && !pTempTree->m_pRightChild)++nLeaves;else pStack->push(pTempTree);pTempTree = pTempTree->m_pLeftChild;}if (!pStack->empty()){pTempTree = pStack->top()->m_pRightChild;pStack->pop();}else break;}delete pStack;return nLeaves; }

求葉子的數量搞定了,那么我們來求最大/最小深度。

思路:

1、根節點添加到隊列中

2、如果隊列隊列不為空:深度加一,執行第3步;

3、記錄下隊列的長度(重要,遍歷用的),遍歷隊列的長度(記錄下的那個長度),定義一個臨時指針指向隊列的底部,從隊列中刪除底部。執行第4步。

4、判斷臨時指針指向的節點是否是葉子節點,如果是:最小深度執行完畢,返回;否則:執行第5步;(如果求最大深度,跳過第4步,執行第5步)

5、左、右孩子添加到隊列。

6、遍歷完畢,重復執行步驟2。

具體代碼如下:

// 求最小深度 使用棧 TEMPTYPE int CBinaryTree<type>::MinDepth() {stack<LPTREENODE> q1, q2;int nCount = 0;if (m_pTree)q1.push(m_pTree);while (!q1.empty() || !q2.empty()){if (!q1.empty()){nCount++;while (!q1.empty()){auto pTemp = q1.top();q1.pop();if (!pTemp->m_pLeftChild && !pTemp->m_pRightChild)return nCount;if (pTemp->m_pLeftChild)q2.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)q2.push(pTemp->m_pRightChild);}}if (!q2.empty()){nCount++;while (!q2.empty()){auto pTemp = q2.top();q2.pop();if (!pTemp->m_pLeftChild && !pTemp->m_pRightChild)return nCount;if (pTemp->m_pLeftChild)q1.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)q1.push(pTemp->m_pRightChild);}}}return nCount; } // 求最大深度 使用棧 TEMPTYPE int CBinaryTree<type>::MinDepth() {stack<LPTREENODE> q1, q2;int nCount = 0;if (m_pTree)q1.push(m_pTree);while (!q1.empty() || !q2.empty()){if (!q1.empty()){nCount++;while (!q1.empty()){auto pTemp = q1.top();q1.pop();if (pTemp->m_pLeftChild)q2.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)q2.push(pTemp->m_pRightChild);}}if (!q2.empty()){nCount++;while (!q2.empty()){auto pTemp = q2.top();q2.pop();if (pTemp->m_pLeftChild)q1.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)q1.push(pTemp->m_pRightChild);}}}return nCount; }

  

  

?

// 求最小深度 使用隊列 m_pTree是根節點 TEMPTYPE int CBinaryTree<type>::MinDepth() {queue<LPTREENODE> que;int nCount = 0;if (m_pTree)que.push(m_pTree);while (!que.empty()){nCount++;int nSize = que.size();while (nSize--){auto pTemp = que.front();que.pop();if (!pTemp->m_pLeftChild && !pTemp->m_pRightChild)return nCount;if (pTemp->m_pLeftChild)que.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)que.push(pTemp->m_pRightChild);}}return nCount; }

  

// 求最大深度 使用隊列 m_pTree是根節點 TEMPTYPE int CBinaryTree<type>::MinDepth() {queue<LPTREENODE> que;int nCount = 0;if (m_pTree)que.push(m_pTree);while (!que.empty()){nCount++;int nSize = que.size();while (nSize--){auto pTemp = que.front();que.pop();if (pTemp->m_pLeftChild)que.push(pTemp->m_pLeftChild);if (pTemp->m_pRightChild)que.push(pTemp->m_pRightChild);}}return nCount; }

  

?

?

?

?

注意:上述代碼中所有m_pTree都是根節點

轉載于:https://www.cnblogs.com/LandyTan/p/8045345.html

總結

以上是生活随笔為你收集整理的二叉树中最大/最小深度与叶子数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。