C++ 二叉树求叶子结点数及输出叶子结点的路径

话不多说,直接看代码

1.头文件及二叉树结点定义

#include
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.主程序调用上方函数即可

你可能感兴趣的:(C++,二叉树,数据结构,链表,算法)