二叉树的深度与什么有关?
一颗树只有一个节点,它的深度是1;
根节点只有左子树而没有右子树,那么二叉树的深度应该是其左子树的深度加1;
根节点只有右子树而没有左子树,那么二叉树的深度应该是其右树的深度加1;
根节点既有左子树又有右子树,那么二叉树的深度应该是其左右子树的深度较大值加1
二叉树的宽度算法如下:
宽度的定义:?
二叉树的宽度定义为具有最多结点数的层中包含的结点数。
求解思路:?
这里需要用到二叉树的层次遍历,即广度优先周游。在层次遍历的过程中,通过读取队列中保留的上一层的节点数来记录每层的节点数,以获取所有层中最大的节点数。
具体实现:
//求二叉树的宽度 ?
int treeWidth(BinaryTreeNode *pRoot){ ?
if (pRoot == NULL)
return 0; ?
int nLastLevelWidth = 0;//记录上一层的宽度 ?
int nCurLevelWidth = 0;//记录当前层的宽度 ?
queue<BinaryTreeNode*> myQueue; ?
myQueue.push(pRoot);//将根节点入队列 ?
int nWidth = 1;//二叉树的宽度 ?
nLastLevelWidth = 1; ?
BinaryTreeNode *pCur = NULL; ?
while (!myQueue.empty())//队列不空 ?
{ ?
while (nLastLevelWidth!= 0){ ?
pCur = myQueue.front();//取出队列头元素 ?
myQueue.pop();//将队列头元素出对 ?
if (pCur->m_pLeft != NULL) ?
myQueue.push(pCur->m_pLeft);
if (pCur->m_pRight != NULL) ?
myQueue.push(pCur->m_pRight);?
nLastLevelWidth--; ?
} ?
nCurLevelWidth = myQueue.size(); ?
nWidth = nCurLevelWidth > nWidth ? nCurLevelWidth : nWidth; ?
nLastLevelWidth = nCurLevelWidth; ?
} ?
return nWidth; ?
}
参考资料
二叉树的构造与遍历.csdn博客[引用时间2018-5-2]