思路
求树的高度本质就是层次遍历树,遍历完后记录下最大的层数,所以可以改造BFS遍历树的算法来实现求解树的最大深度
先来回顾一下BFS遍历二叉树
BFS层次遍历二叉树
其实遍历一般的树也是同样的思路,每次需要将某个节点所有的孩子都push进队列里
struct Bitree {
int num;
struct Bitree *lchild;
struct Bitree *rchild;
};
queue<struct Bitree *> queue_;
struct Bitree *root = create(); //创建一棵树
queue_.push(root);
while(queue_.size()){
tmp = queue_.front();
queue_.pop();
cout << tmp->num <<endl; //输出节点编号
if(tmp->lchild != NULL)
queue_.push(tmp->lchild);
if(tmp->rchild != NULL)
queue_.push(tmp->rchild);
}
接下来,再看一下利用BFS求一般树的最大深度
BFS求树的最大深度
struct VNode{
int num;
int visited;
vector<int> list; //我们使用邻接表的方式来构建树,
//使用vector是很高效的方式,
//每次添加相邻接点只需要push_back进去就好
};
deque<int> queue_; //双端队列
int H = 0; //深度
int width = 1;
while(queue_.size()){
for(int i=0; i<width; i++){//重点是这层for循环
temp = queue_.front();
queue_.pop_front();
vnodes[temp].visited = 1;
//将孩子push进队列
for(int i=0; i<vnodes[temp].list.size(); i++){
if(vnodes[vnodes[temp].list[i]].visited == 0)//未被访问过
queue_.push_back(vnodes[temp].list[i]);
}
}
width = queue_.size();
if(queue_.size())
H ++;
}
与普通的BFS不同的是,在while循环里面多了一层for循环,而for循环的次数是每一层的节点数量width
,当for循环结束后,本层上的所有节点都被遍历完,并且下一层的所有节点都已经push进队列里。只有当每次遍历完一层后,才能对深度H进行加1。