博客
关于我
C++实现二叉树结构及其二叉树常用算法
阅读量:726 次
发布时间:2019-03-21

本文共 1813 字,大约阅读时间需要 6 分钟。

文章目录

头文件

使用node 定义节点,并重命名为BTNode。二叉树类 BTree中含有一个成员BTNode* head;存放二叉树的头节点。

typedef int ElemType;const int MaxSize = 20;typedef struct node {	data: ElemType;	lchild: node*;	rchild: node*;}BTNode;class BTree {	head: BTNode*;	public:		BTree() {			head = new BTNode;		}		BTree(const char* str) {			CreateBTNode(str);		}		// ...其他成员函数定义}

成员函数

构造函数

两个构造函数:一个无参构造,只为头节点开辟空间。一个有参构造,传入一个以括号表示法表示的树的const char*字符串对象。

BTree::BTree(const char* str) {	CreateBTNode(str);}

创建二叉树CreateBTNode

使用void CreateBTNode(const char* str);方法创建。

创建过程使用栈作为辅助,对于一个合法的字符串,遍历其中所有元素,如果遇到一个节点元素(default部分),初始化节点,若该节点作为头节点,则执行
this->head = p;,若不是头节点,通过
k判断该节点作为栈顶元素的左孩子节点或者右孩子节点。如果遇到
(,此时
p已经被赋值,其值为上一个遍历到的节点元素,
(表明该节点
p将作为之后节点的父节点,将
p进栈,并将
k置为1。如果遇到
,,表明某个节点的左子树处理完,将要处理右孩子。如果遇到
),表明当前栈顶元素的孩子节点已经处理完,将其出栈。

void BTree::CreateBTNode(const char* str) {	BTNode* St[MaxSize], * p = NULL;	int top = -1;	int k = 1;	int j = 0;	char ch;	this->head = NULL;	ch = str[j];	while (ch != '\0') {		switch (ch) {		case '(': // 遇到左括号			++top;			St[top] = p;			k = 1;			break;		case ')': // 遇到右括号			top--;			break;		case ',': // 遇到逗号			k = 2;			break;		default:			// 遇到一个元素时,节点初始化			p = new BTNode;			p->data = ch;			p->lchild = p->rchild = NULL;			if (this->head == NULL) {				this->head = p;			} else {				switch (k) {				case 1:					St[top]->lchild = p;					break;				case 2:					St[top]->rchild = p;					break;				}			}		}		ch = str[++j];	}}

输出二叉树DispBTree

BTree类提供公共接口void DispBTree();用于输出二叉树,并void DispBTree(BTNode* b);中实现接口

输出过程通过递归实现,并以括号表示法格式输出。

void BTree::DispBTree() {	this->DispBTree(this->head);	cout << endl;} void BTree::DispBTree(BTNode* b) {if (b == NULL) return;cout << (char)b->data;if (b->lchild != NULL || b->rchild != NULL) {cout << "(";this->DispBTree(b->lchild);if (b->rchild != NULL) {cout << ",";}this->DispBTree(b->rchild);cout << ")";}}

转载地址:http://lttgz.baihongyu.com/

你可能感兴趣的文章
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>
OSG学习:场景图形管理(二)——单窗口多相机渲染
查看>>
OSG学习:场景图形管理(四)——多视图多窗口渲染
查看>>
OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
查看>>
Sql 随机更新一条数据返回更新数据的ID编号
查看>>
OSG学习:空间变换节点和开关节点示例
查看>>
OSG学习:纹理映射(一)——多重纹理映射
查看>>
OSG学习:纹理映射(七)——聚光灯
查看>>
OSG学习:纹理映射(三)——立方图纹理映射
查看>>
OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
查看>>
OSG学习:纹理映射(五)——计算纹理坐标
查看>>
OSG学习:纹理映射(六)——灯光
查看>>
OSG学习:纹理映射(四)——三维纹理映射
查看>>
OSG:从源码看Viewer::run() 一
查看>>
OSI七层模型与TCP/IP四层与五层模型详解
查看>>
OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
查看>>
OSM数据如何下载使用(地图数据篇.11)
查看>>