1.求树的叶子结点
例:编写递归算法,计算二叉树中叶子结点的数目。
思路:输出叶子结点比较简单,用任何一种遍历算法,凡是左右指针均空者,则为叶子,将其统计并打印出来。
DLR_CountLeafNum(NODE *root)//采用中序遍历的递归算法
{
if ( root) //非空二叉树条件,还可写成if(root !=NULL )
{ if(!root->lchild&&!root->rchild) //是叶子结点则统计并打印
{ sum++; printf("%d\n",root->data); }
DLR_CountLeafNum(root->lchild); //递归遍历左子树,直到叶子处;
DLR_CountLeafNum(root->rchild);}//递归遍历右子树,直到叶子处;
} return(0);
}
(1)
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
/*
typedef struct BiTNode
{
int date;
struct BiTNode* lchild,* rchild;
}BiTNode,*BiTree;
*/
//二叉链表示法
struct BiTNode
{
int date;
struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;
typedef struct BiTNode BiTNode;
typedef struct BiTNode *BiTree;
void preOrder(BiTNode* root)
{
if (root == NULL)
{
return;
}
printf("%d", root->data);
//遍历左子树
preOrder(root->lchild);
//遍历右子树
preOrder(root->rchild);
}
void inOrder(BiTNode* root)
{
if (root == NULL)
{
return;
}
//遍历左子树
inOrder(root->lchild);
printf("%d", root->data);
//遍历右子树
inOrder(root->rchild);
}
void postOrder(BiTNode* root)
{
//遍历左子树
postOrder(root->lchild);
//遍历右子树
postOrder(root->rchild);
printf("%d", root->data);
}
int sum;
void coutLeaf(BiTNode* T)
{
if (T != NULL)
{
if (T->lchild == NULL&&T->rchild == NULL)
{
sum++;
}
if (T->lchild)
{
coutLeaf(T->lchild);