二叉树中叶子节点的个数(非递归)

来源:互联网 发布:济南矩阵直销软件 编辑:程序博客网 时间:2024/04/28 05:39

算法思想:在遍历二叉树时,判断当前访问的节点是不是叶子节点,然后对叶子节点求和即可。(前序、中序、后序、按层遍历均可)

以”前序”为例,代码中有详细注释,不再具体阐述,实现如下:

#include <iostream>#define MAXSIZE 1000typedef struct node{    char data;    struct node *lchild;    struct node *rchild;}BiNode, *BiTree;// 先序建立二叉树 (输入时,按先序次序输入二叉树中结点的值,以 # 字符表示空树)BiTree createBiTree(){    BiTree T;    char c;    scanf("%c", &c);    if (c == '#')        T = NULL;    else    {        T = new BiNode;  // 或 T = (BiTree)malloc(sizeof(BiNode));        T->data = c;        T->lchild = createBiTree();        T->rchild = createBiTree();    }    return T;}// 前序遍历void PreOrderTraverse(BiTree T){    if (T)    {        printf("%c\n", T->data);        PreOrderTraverse(T->lchild);        PreOrderTraverse(T->rchild);    }}// 非递归,求二叉树中叶子节点的个数int leaf_num(BiTree T){    int top = -1; // 栈为空    int count = 0;    BiTree s[MAXSIZE]; // 申请一个栈空间    while (T != NULL || top != -1) // 当前树的根节点不为空 或 栈不为空(说明需要继续遍历)    {        while (T != NULL) // 当前树的根节点不为空        {            if(T->lchild == NULL && T->rchild == NULL) // 若当前根节点的左右子树都为空,则是叶子节点                count++;            s[++top] = T; // 先 ++top,然后将当前的根节点入栈            T = T->lchild; // 然后访问当前根节点的左子树        }        if (top != -1) // 若此时栈不为空(此时跳出了上面的while(T != NULL),说明了当前根节点的左子树为空)        {            T = s[top--]; // 先获取当前的根节点(即让当前的根节点出栈),然后 top--;            T = T->rchild; // 然后访问当前根节点的右子树        }    }    return count;}int main(int argc, const char * argv[]) {    BiTree T = createBiTree(); // 建立    PreOrderTraverse(T); // 输出    int num = leaf_num(T);    printf("\n%d\n", num);    return 0;}
1 0