你想知道的二叉树基本操作

前言:

二叉树的学习结束了,还是决定把基础的知识在巩固一遍,最好的方法就是写程序了。代码附上,有二叉树的创建先序遍历,返回节点,按层次遍历。嘻嘻

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<iomanip>
using namespace std;
#define MAXQSIZE 100


//二叉树的二叉链表储存表示
typedef struct BiTNode{
	char data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree,P;


//中序遍历的递归算法
void InOrderTraverse(BiTree T)
{//中序遍历二叉树T的递归算法
	if(T)//若二叉树非空
	{
		InOrderTraverse(T->lchild);//中序遍历左子树
		cout<<T->data;//访问根节点
		InOrderTraverse(T->rchild);//中序遍历右子树
	}
}

void PreOrderTraverse(BiTree T)
{//先序遍历二叉树T的递归算法
	if(T)//若二叉树非空
	{
		cout<<T->data;//访问根节点
		PreOrderTraverse(T->lchild);//先序遍历左子树
		PreOrderTraverse(T->rchild);//先序遍历右子树
	}
}

void PostOrderTraverse(BiTree T)
{//后序遍历二叉树T的递归算法
	if(T)//若二叉树非空
	{
		PostOrderTraverse(T->lchild);//后序遍历左子树
		PostOrderTraverse(T->rchild);//后序遍历右子树
		cout<<T->data;//访问根节点
	}
}

//先序遍历创建二叉链表
void CreateBiTree(BiTree &T)
{//按先序次序输入二叉树中的节点的值(一个字符),创建二叉链表表示的二叉树T
	char ch;
	//"请按照先序遍历来输入二叉树节点"
	cin>>ch;
	if(ch=='#') T=NULL;//递归结束,建空树
	else{
		T = new BiTNode;//生成根节点
		T->data = ch;//根节点数据域置为ch
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}


//计算二叉树的深度
int Depth(BiTree T)
{//计算二叉树的深度
	if(T==NULL) return 0;
	else
	{
		int m = Depth(T->lchild);
		int n = Depth(T->rchild);
		if(m>n) return(m+1);
		else return(n+1);
	}
}

//统计二叉树节点的个数
int NodeCount(BiTree T)
{//统计二叉树T中节点的个数
	if(T==NULL) return 0;
	else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}

int NodeLeaf(BiTree T)
{
	//统计二叉树中叶子节点的个数
	if(T==NULL)
		return 0;
	else if(T->lchild==NULL&&T->rchild==NULL)
		return 1;
	else
		return NodeLeaf(T->lchild)+NodeLeaf(T->rchild);
}

//统计度为1的节点个数
int Node1(BiTree T)
{
	if(T==NULL)
		return 0;
	else if((T->lchild==NULL&&T->rchild)||(T->rchild==NULL&&T->lchild))
		return Node1(T->lchild)+Node1(T->rchild)+1;
	else
		return Node1(T->lchild)+Node1(T->rchild);
}

//统计度为2的节点个数
int Node2(BiTree T)
{
	if(T==NULL)
		return 0;
	else if(T->lchild!=NULL&&T->rchild!=NULL)
		return Node2(T->lchild)+Node2(T->rchild)+1;
	else
		return Node2(T->lchild)+Node2(T->rchild);
}

//按层次遍历访问节点
void level_traverse(BiTree T)
{
	int i = 1;
    if (T == NULL)
        return;
    queue <BiTree> q;
    q.push(T);
    while (!q.empty())
    {
        T = q.front();
        q.pop();
		cout <<setw(2)<<T->data;
        if (T->lchild!= NULL)
        {
            q.push(T->lchild);//左孩子入队
        }
        if (T->rchild != NULL)
        {
            q.push(T->rchild);//右孩子入队
        }
    }
}


int main()
{
	int n;
	char c;
	BiTree T;
	CreateBiTree(T);
	do{
		cout<<"1.输出二叉树先序、中序、后序遍历下的节点访问次序;"<<endl;
		cout<<"2.输出二叉树的所有节点个数"<<endl;
		cout<<"3.输出二叉树叶子个数"<<endl;
		cout<<"4.输出二叉树度为1的节点个数"<<endl;
		cout<<"5.输出二叉树度为2的节点个数"<<endl;
		cout<<"6.输出二叉树的高度"<<endl;
		cout<<"7.输出二叉树的按层次遍历的节点访问次序"<<endl;
		cout<<"******请选择功能******"<<endl;
		cin>>n;
		switch(n)
		{
		case 1:
			cout<<"先序:"<<endl;
			PreOrderTraverse(T);
			cout<<endl;
			cout<<"中序:"<<endl;
			InOrderTraverse(T);
			cout<<endl;
			cout<<"后序:"<<endl;
			PostOrderTraverse(T);
			cout<<endl;
			break;
			//输出二叉树先序、中序、后序遍历下的节点访问次序;
		case 2:
			cout<<"所有节点个数为:"<<NodeCount(T)<<endl;
			break;//输出二叉树的所有节点个数
		case 3:
			cout<<"所有叶子节点个数为:"<<NodeLeaf(T)<<endl;
			break;//输出二叉树的叶子节点个数
		case 4:
			cout<<"所有度为1的节点个数为:"<<Node1(T)<<endl;
			break;//输出二叉树中度为1的节点个数
		case 5:
			cout<<"所有度为2的节点个数为:"<<Node2(T)<<endl;
			break;//输出二叉树中度为2的节点个数
		case 6:
			cout<<"二叉树的高度为:"<<Depth(T)<<endl;
			break;//输出二叉树的高度
		case 7:
			cout<<"按层次遍历:"<<endl;
			level_traverse(T);
			break;//输出二叉树按层次遍历序列
		default:
			break;
		}
		cout<<"是否继续(Y继续)"<<endl;
		cin>>c;
	}while(c=='Y'||c=='y');
	return 0;
}

后记:

之后会来一个神奇的哈夫曼树,特工必备,现在也可以实现了。有更好的结构可以评论交流哦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

threecat.up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值