话不多说,直接看代码
1.头文件及二叉树结点定义
#include<iostream>
using namespace std;
typedef struct Bitnode
{
char data;
struct Bitnode* lchild, * rchild;
}Bitnode,*Bitree;
2.建立二叉链表,这里用的是先序建立
void FCreatBitree(Bitree& T)//先序建立二叉链表
{
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else
{
T = new Bitnode;
T->data = ch;
FCreatBitree(T->lchild);
FCreatBitree(T->rchild);
}
}
3.叶子结点数的计算,采用递归方法
int Leaves_count(Bitree T)//求叶子节点数
{
int num=;
if (T==NULL) {
return 0;
}
if (T->lchild == NULL && T->rchild == NULL)
num++;
Leaves_count(T->lchild);
Leaves_count(T->rchild);
return num;
}
4.打印叶子结点路径
void Leaves_path(Bitree T)
{
Bitree p, q;//定义2个结点用于保存
int top = 0;//top为当前p所指结点位置
Bitree s[50];//使用q保存刚遍历过的节点,初始为空
q = NULL;
p = T;//传入的结点赋值给p
while (p != NULL || top != 0) //如果p不为空或者top不为零进入循环
{
if (p != NULL) //如果p不为空,直接遍历到一个左叶子结点
{
s[++top] = p;
p = p->lchild;
}//遍历完后,p即为一个左叶子结点,在下一个循环中进入else if
else if (top > 0)
{
p = s[top];//把上面遍历的最后结点赋给p
if (p->rchild == NULL || p->rchild == q)
{
//如果p为叶子节点,则打印路径
if (p->lchild == NULL && p->rchild == NULL)
{
for (int i = 1; i <= top; i++)
cout <<s[i]->data <<" ";
cout << endl;
}
//使用q保存刚访问过的节点
q = p;
top--;
//跳过刚才的左遍历,继续退栈
p = NULL;
}
//否则遍历右子树
else p = p->rchild;
}
}
}
5.主程序调用上方函数即可