二叉树(链表)的相关操作

(1)初始化二叉链表;

(2)前序遍历二叉链表(递归实现);

(3)中序遍历二叉链表(递归实现);

(4)后序遍历二叉链表(递归实现);

(5)层序遍历二叉链表(队列实现);

(6)销毁二叉链表(递归实现)。

(7)复制二叉树

(8)求二叉树的深度

(9)求二叉树的结点数

参考书籍《数据结构》C语言版第2版 人民邮电出版社 

前序输入二叉树:

 

#include <iostream>
#include<queue>
using namespace std;

typedef char TElemType;


//二叉树的二叉链表储存表示
typedef struct BiTNode
{
	TElemType data;
	struct BiTNode *lchild, *rchild;//左右孩子指针

}BiTNode, *BiTree;

//(1)初始化二叉链表:理解扩展二叉树及其前序遍历序列;
void CreatBitree(BiTree &T)
{
	TElemType ch;
	cin >> ch;
	//getchar();
	if (ch == '#') T = NULL; //递归结束创建空树

	else//创建二叉链表
	{
		T = new BiTNode;//根结点
		T->data = ch;
		CreatBitree(T->lchild);//递归创建左子树
		CreatBitree(T->rchild);
	}

}


//(2)前序遍历二叉链表(递归实现);
void PreOrderTraverse(BiTree T)
{
	if (T)
	{
		cout << T->data;//访问根结点

		PreOrderTraverse(T->lchild);
		PreOrderTraverse(T->rchild);
	}
}


//(3)中序遍历二叉链表(递归实现);
void InOrderTraverse(BiTree T)
{
	if (T)
	{
		InOrderTraverse(T->lchild);//中序遍历左子树
		cout << T->data;//访问根结点
		InOrderTraverse(T->rchild);//中序遍历右子树
	}
}

//(4)后序遍历二叉链表(递归实现);
void PostOrderTraverse(BiTree T)
{
	if (T)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data;//访问根结点
	}
}

//(5)层序遍历二叉链表;
void LevelOrderTraverse(BiTNode* T)
{
	queue<BiTNode*>q;
	q.push(T);
	while (!q.empty())
	{
		cout << q.front()->data;
		if (q.front()->lchild != NULL)q.push(q.front()->lchild);
		if (q.front()->rchild != NULL)q.push(q.front()->rchild);
		q.pop();

	}
}

//(6)销毁二叉链表(递归实现)。
void DestroyTree(BiTree T)
{
	if (T == NULL) return;

	DestroyTree(T->lchild);
	DestroyTree(T->rchild);

	delete T;
}

//复制二叉树
void Copy(BiTree T, BiTree &NewT)
{
	if (T == NULL)
	{
		NewT = NULL;
		return;
	}
	else
	{
		NewT = new BiTNode[9];
		NewT->data = T->data;
		Copy(T->lchild, NewT->lchild);
		Copy(T->rchild, NewT->rchild);
	}

}

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

		if (m > n) return(m + 1);
		else return(n + 1);
	}
}

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



void main()
{
	BiTree T;


	cout << "创建二叉树: "<<endl;
	CreatBitree(T);
	cout << endl;

	cout << "先序遍历: ";
	PreOrderTraverse(T);
	cout << endl;

	cout << "中序遍历: ";
	InOrderTraverse(T);
	cout << endl;

	cout << "后序遍历: ";
	PostOrderTraverse(T);
	cout << endl;

	cout << "层序遍历: ";
	LevelOrderTraverse(T);
	cout << endl;

	cout << "创建树的深度为:" << Depth(T) << endl;
	cout << "创建树的总结点个数为:" << NodeCount(T) << endl;

	DestroyTree(T);
	system("pause");
}

  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值