题目内容:
求二叉树的宽度,并尝试用递归和非递归的方法实现
实现思路:
求二叉树的宽度即是求二叉树的叶子节点数
//递归——自上而下的寻找叶子结点,遍历到最底部逐层往上汇报
//非递归——采用广度优先遍历的方式每遍历一个结点就检查一个结点
代码实现:
//递归实现:自上而下寻找叶子结点,遍历到最底部逐层从下往上汇报
int Count(Tree &t)
{
if(t == NULL) return 0; //空树返回0
else if(t->left == NULL && t->right == NULL) return 1; //左右子树为空为叶子结点,返回1
return Count(t->left) + Count(t->right); //返回左右叶子结点之和
}
//非递归实现
int levelOrder(Tree &t){
if(t == NULL) return 0;
queue<TreeNode*> q; //既然是BFS就要用到队列
int count = 0; //叶子个数
q.push(t);
while(!q.empty()){
TreeNode* p = q.front();
if(p->left == NULL && p->right == NULL) count++; //左右子树为空为叶子结点
q.pop();
if(p->left) q.push(p->left);
if(p->right) q.push(q->right);
}
}
题目收获:
1.进入算法的时候一定一定要判空!
2.注意获取队列队头结点要在循环中实现;
3.递归的思想和写法尚待总结;