BFS求树的深度
基本思路
BFS:从根节点开始,沿着树的宽度遍历节点,直到所有节点被遍历完为止。
在BFS过程中,通过判断当前层是否还有节点,从而来实现层数的计数,进而得到树的深度。
代码
int BFS(TreeNode* pRoot){
if(pRoot==NULL) return 0;
int level=0;
queue<TreeNode*> nodeQ;
nodeQ.push(pRoot);
while(!nodeQ.empty()){
int count=nodeQ.size();
for(int i=0;i<count;i++){
TreeNode* p=nodeQ.front();
nodeQ.pop();
if(p->left!=NULL) nodeQ.push(p->left);
if(p->right!=NULL) nodeQ.push(p->right);
}
level++;
}
return level;
}
BFS遍历求深度 使用队列,先将根节点入队,然后出队(队列中元素全部出队),深度加1,然后将出队节点的所有相邻节点入队(队列中保存下一层的所有节点)。所以每次出队的时候,要把队列中所有节点出队(当前层所有节点出队),然后层数加1,同时,再把当前层节点的下一层的结点全部入队,用于下一层的判断。
分治法
基本思想
要求树Tree的深度,可以分成两部分来求,先求出左子树的深度和右子树的深度,然后取左子树和右子树的中的大值maxLevel,最后maxLevel+1即为树Tree的深度。
代码
int TreeDepth(TreeNode* pRoot) {
if(pRoot==NULL) return 0;
return max(TreeDepth(pRoot->left),TreeDepth(pRoot->right))+1;
}
分治法求深度 先求出左子树的深度和右子树的深度,然后取max(左子树深度,右子树深度)+1即为树的深度。
总结
要理解树的各种遍历的特点,然后根据问题选择合适的遍历方式解决问题。分治法求树的深度,倒是没有马上想到,还需加强算法的理解。编程路上,砥砺前行~