二叉树中最大/最小深度与叶子数
首先我們需要了解什么是“樹的深度”和“樹的葉子”。
樹的葉子:一棵樹當(dāng)中沒有子結(jié)點(diǎn)(即度為0)的結(jié)點(diǎn)稱為葉子結(jié)點(diǎn),簡稱“葉子”。?葉子是指度為0的結(jié)點(diǎn),又稱為終端結(jié)點(diǎn)。
樹的深度:樹中最大的結(jié)點(diǎn)層。舉個(gè)例子:你爺爺是根節(jié)點(diǎn),你爸爸叔叔是你爺爺?shù)淖?右孩子,你是你爸爸的左孩子。那么你爸爸叔叔的深度是2,你的深度是3。(夠通俗吧?)
首先我們來求樹的葉子數(shù)量,葉子的特征是沒有子節(jié)點(diǎn)。
思路:
1、判斷該節(jié)點(diǎn)左、右孩子是否都等于空,如果是:葉子數(shù)加一;如果不是:入棧
2、該節(jié)點(diǎn)等該節(jié)點(diǎn)的左子節(jié)點(diǎn),重復(fù)步驟1,直到該節(jié)點(diǎn)等于空,執(zhí)行步驟3。
3、如果棧非空:零時(shí)指針指向棧頂元素的右子節(jié)點(diǎn),刪除棧頂元素;如果棧為空:執(zhí)行完畢,退出。
具體代碼如下:
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; }求葉子的數(shù)量搞定了,那么我們來求最大/最小深度。
思路:
1、根節(jié)點(diǎn)添加到隊(duì)列中
2、如果隊(duì)列隊(duì)列不為空:深度加一,執(zhí)行第3步;
3、記錄下隊(duì)列的長度(重要,遍歷用的),遍歷隊(duì)列的長度(記錄下的那個(gè)長度),定義一個(gè)臨時(shí)指針指向隊(duì)列的底部,從隊(duì)列中刪除底部。執(zhí)行第4步。
4、判斷臨時(shí)指針指向的節(jié)點(diǎn)是否是葉子節(jié)點(diǎn),如果是:最小深度執(zhí)行完畢,返回;否則:執(zhí)行第5步;(如果求最大深度,跳過第4步,執(zhí)行第5步)
5、左、右孩子添加到隊(duì)列。
6、遍歷完畢,重復(fù)執(zhí)行步驟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; }
?
// 求最小深度 使用隊(duì)列 m_pTree是根節(jié)點(diǎn) 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; }// 求最大深度 使用隊(duì)列 m_pTree是根節(jié)點(diǎn) 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都是根節(jié)點(diǎn)
轉(zhuǎn)載于:https://www.cnblogs.com/LandyTan/p/8045345.html
總結(jié)
以上是生活随笔為你收集整理的二叉树中最大/最小深度与叶子数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单团队-爬虫豆瓣top250-项目总结
- 下一篇: 15.大容量存储结构