树的基本题目

题目内容:

求二叉树的宽度,并尝试用递归和非递归的方法实现

 实现思路:

求二叉树的宽度即是求二叉树的叶子节点数

//递归——自上而下的寻找叶子结点,遍历到最底部逐层往上汇报

//非递归——采用广度优先遍历的方式每遍历一个结点就检查一个结点

代码实现:

//递归实现:自上而下寻找叶子结点,遍历到最底部逐层从下往上汇报

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.递归的思想和写法尚待总结;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值