标签:node 个数 oid main 应用 using ace turn 数据结构
简述:
二叉树是十分重要的数据结构,主要用来存放数据,并且方便查找等操作,在很多地方有广泛的应用。
二叉树有很多种类,比如线索二叉树,二叉排序树,平衡二叉树等,本文写的是最基础最简单的二叉树。
思路:
二叉树的建立采用的是递归的思想:给定一个指向根节点的指针,然后递归调用ceate()函数,自动生成一个二叉树。就像是在地上挖了个坑(根节点)
,然后他会拿着铲子(create函数)按照一定的规则自动挖一个很大的洞穴(二叉树)出来。当然挖坑前需要先定义每个洞长什么样(定义节点结构)。
二叉树的遍历采用的也是递归的思想:如果节点有数据,则按照遍历规则打印根节点和孩子节点,没有数据则返回直到所有数据都遍历完,递归结束。
代码如下:
#include "stdafx.h"                //我自己的编译器的问题所以要加
#include<iostream>
using namespace std;
typedef char TElemType;
typedef struct BiTNode {
	TElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode,*BiTree;      //*BiTree的意思是给 struct BiTNode*起了个别名,叫BiTree,故BiTree为指向节点的指针。
void createBiTree(BiTree &T)       //创建二叉树。
{
	char ch;
	cin >> ch;
	if (‘#‘ == ch)   
		T = NULL;
	else
	{
		T = new BiTNode;
		T->data = ch;
		createBiTree(T->lchild);
		createBiTree(T->rchild);
	}
}
void PerOrderTraverse(BiTree T)    //前序遍历二叉树并打印。
{
	if (T)
	{
		cout << T->data<<" ";
		PerOrderTraverse(T->lchild);
		PerOrderTraverse(T->rchild);
	}
}
void InOrderTraverse(BiTree T)     //中序遍历二叉树并打印。
{
	if (T)
	{
		InOrderTraverse(T->lchild);
		cout << T->data<<" ";
		InOrderTraverse(T->rchild);
	}
}
void PostOrderTraverse(BiTree T)    //后序遍历二叉树并打印。
{
	if (T)
	{
		PostOrderTraverse(T->lchild);
		PostOrderTraverse(T->rchild);
		cout << T->data<<" ";
	}
}
void Copy(BiTree T, BiTree &NewT)  //二叉树的拷贝
{
	if (T == NULL)
	{
		NewT = NULL;
		return;
	}
	else
	{
		NewT = new BiTNode;
		NewT->data = T->data;
		cout << NewT->data<<" ";
		Copy(T->lchild, NewT->lchild);
		Copy(T->rchild, NewT->rchild);
		
	}
}
int NodeCount(BiTree T)            //求二叉树中结点个数
{
	if (T == NULL)
		return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
int LeafCount(BiTree T) {
	                               //求二叉树中叶子(终端节点)个数
	if (T == NULL)
		return 0;
	if (T->lchild == NULL && T->rchild == NULL)
		return 1;
	else
		return LeafCount(T->lchild) + LeafCount(T->rchild);
}
int main()
{
	BiTree T;                         //声明一个指向二叉树根节点的指针                      
	BiTree NewT;                      //声明一个指向二叉树根节点的NewT指针,用于复制T的内容 
	createBiTree(T);
	cout << "二叉树创建完毕!" << endl;
	cout << "二叉树中结点个数:" << endl;
	cout<<NodeCount(T)<<endl;
	cout << "二叉树中叶子个数:" << endl;
	cout << LeafCount(T) << endl;
	cout << "拷贝结果:" << endl;
	Copy(T, NewT);
	cout << endl;
	cout << "前序遍历二叉树:" << endl;
	PerOrderTraverse(T);
	cout << endl;
	cout << "中序遍历二叉树:" << endl;
	InOrderTraverse(T);
	cout << endl;
	cout << "后序遍历二叉树:" << endl;
	PostOrderTraverse(T);
	cout << endl;
	return 0;
}
测试样例+结果:
假设我们要建立一个如下图所示的二叉树,#代表空节点,按照前序遍历顺序二叉树表示为:ab##c## (此处为前序)

下面是代码的运行结果:

标签:node 个数 oid main 应用 using ace turn 数据结构
原文地址:https://www.cnblogs.com/Trojan00/p/8799340.html