二叉树的二叉链表存储结构,二叉树的前序、中序、后序、层序遍历操作,求二叉树叶子结点个数并输出叶子结点的实现(c++ 数据结构 实验五)

一、实验内容要求
1.基于前序序列,构建二叉树的二叉链表存储结构
2.对建立的二叉树进行前序、中序、后序、层序遍历操作
3.求二叉树叶子结点个数并输出叶子结点信息
二叉树图示:
在这里插入图片描述

二、代码

#include <iostream>
using namespace std;

extern int count;  //全局变量 
int count = 0;

struct BiNode                   //定义二叉链表的结点 
{
	char data;
	BiNode * lchild, * rchild;
};

class BiTree                 //类声明 
{
	public:
		BiTree()
		{
			root = Creat(root);
		}	
		~BiTree()
		{
			Release(root);
		}
		
		void PreOrder()
		{
			PreOrder(root);
		}
		
		void InOrder()
		{
			InOrder(root);
		}
		
		void PostOrder()
		{
			PostOrder(root);
		}
		
		void LevelOrder()   //层序遍历 
		{
			LevelOrder(root);
		}
		
		void CountLeaf()  //求叶子结点个数 
		{
			CountLeaf(root);
		}
		
	private:
		BiNode * root;
		BiNode * Creat(BiNode * bt);
		void Release(BiNode * bt);
		void PreOrder(BiNode * bt);
		void InOrder(BiNode * bt);
		void PostOrder(BiNode * bt);
		void LevelOrder(BiNode * bt);
		void CountLeaf(BiNode * bt);
};



BiNode * BiTree::Creat(BiNode * bt)        //建定义立二叉链表的函数 
{
	char ch;
	cout << "输入结点数据" << endl;
	cin >> ch;
	if(ch == '#')
	{
		return NULL;
	}else
	{
		bt = new BiNode;
		bt -> data = ch;
		bt -> lchild = Creat(bt -> lchild);
		bt -> rchild = Creat(bt -> rchild);
	}
	return bt;
}

void BiTree::Release(BiNode * bt)  //定义析构函数 
{
	if(bt != NULL)
	{
		Release(bt -> lchild);
		Release(bt -> rchild);
		delete bt;
		
	}
}

void BiTree::PreOrder(BiNode * bt) 
{
	if(bt == NULL)
	{
		return; 
	}else
	{
		cout << bt -> data << " ";
		PreOrder(bt -> lchild);
		PreOrder(bt -> rchild); 
	}
}

void BiTree::InOrder(BiNode * bt) 
{
	if(bt == NULL)
	{
		return; 
	}else
	{
		InOrder(bt -> lchild);
		cout << bt -> data << " ";
		InOrder(bt -> rchild); 
	}
}

void BiTree::PostOrder(BiNode * bt) 
{
	if(bt == NULL)
	{
		return; 
	}else
	{
		PostOrder(bt -> lchild);
		PostOrder(bt -> rchild); 
		cout << bt -> data << " ";		
	}
}

void BiTree::LevelOrder(BiNode * bt) 
{
	BiNode * Q[100],* q = NULL;
	int front = -1,rear = -1;
	if(root == NULL)
	{
		return;
	}
	Q[++rear] = root;
	while(front != rear)
	{
		q = Q[++front];
		cout << q -> data << " ";
		if(q -> lchild != NULL)
		{
			Q[++rear] =q -> lchild;
		}
		if(q -> rchild != NULL)
		{
			Q[++rear] =q -> rchild;
		}
	}
}

void BiTree::CountLeaf(BiNode * bt) 
{
	if(bt != NULL)
	{
		if(bt -> lchild == NULL && bt -> rchild == NULL)
		{
			count++;
			cout << bt -> data << " ";	
		}
		CountLeaf(bt -> lchild);	
		CountLeaf(bt -> rchild);	
		
	}	
}

int main()
{
	BiTree T;
	
	cout << "前序遍历:" << endl;
	T.PreOrder();
	cout << endl;
	 
	cout << "中序遍历:" << endl;
	T.InOrder();
	cout << endl;

	cout << "后序遍历:" << endl;
	T.PostOrder();
	cout << endl;
	
	cout << "层序遍历:" << endl;
	T.LevelOrder();
	cout << endl;
	
	cout << "叶子结点:" << endl;
	T.CountLeaf();
	cout << endl;
	cout << "叶子结点个数为:" << count << endl;
	
	return 0;
} 

三、实验结果
在这里插入图片描述

  • 9
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值