二叉树操作 C++实现

所谓之其然,还要知其所以然,为了提高C++开发效率,我们可能会选择直接使用标准库提供的二叉树操作,但是,作为一个合格的programmer,有必要掌握这些常用数据结构的基本实现。本博文旨在分享自己用C++实现的二叉树操作源码,主要对二叉树的四个遍历方式(层次遍历,先序遍历,中序遍历,后续遍历)做了实现。希望对大家学习二叉树有所参考和帮助。由于时间有限,若有不足,欢迎指出!如果对按层次遍历算法还是没有掌握原理的,可以回复我,我尽力助之!

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

typedef struct BinaryTree {
	string data;
	BinaryTree *parent,*left,*right;
};

//初始化树
BinaryTree* initBinaryTree(string data) {
	BinaryTree *binaryTree = new BinaryTree();
	binaryTree->parent = NULL;
	binaryTree->left = NULL;
	binaryTree->right = NULL;
	binaryTree->data = data;
	return binaryTree;
}

//查找结点
BinaryTree* findTreeNode(BinaryTree *binaryTree,string data) {
	BinaryTree *temp;
	if (binaryTree == NULL) {
		return NULL;
	}
	if (binaryTree->data == data) {
		return binaryTree;
	}
	if ((temp = findTreeNode(binaryTree->left, data)) != NULL) {
		return temp;
	}
	if ((temp = findTreeNode(binaryTree->right, data)) != NULL) {
		return temp;
	}
	return NULL;
}

//添加节点
void addTreeNode(BinaryTree *binaryTree,string data) {
	BinaryTree *node = new BinaryTree();
	node->data = data;
	node->left = NULL;
	node->right = NULL;

	cout << "请输入要插入的父节点的数据:" << endl;
	string parentData;
	BinaryTree *parentNode;
	do
	{		
		cin >> parentData;
		parentNode = findTreeNode(binaryTree, parentData);
		if (parentNode == NULL) {
			cout << "该父节点不存在,请重新输入:" << endl;
		}
	} while (parentNode == NULL);

	cout << "请选择要插入位置,1代表左节点,2代表右节点:" << endl;
	int a;
	do
	{
		cin >> a;
		if (a != 1 && a != 2) {
			cout << "无法进行选择,请重新输入:" << endl;
		}
	} while (a != 1 && a != 2);


	if (a == 1) {
		if (parentNode->left == NULL) {
			parentNode->left = node;
			node->parent = parentNode;
			cout << "插入左节点成功:" << endl;
		}
		else {
			cout << "左节点已经有数据了,无法插入!" << endl;
		}
	}

	if (a == 2) {
		if (parentNode->right == NULL) {
			parentNode->right = node;
			node->parent = parentNode;
			cout << "插入右节点成功:" << endl;
		}
		else {
			cout << "右节点已经有数据了,无法插入!" << endl;
		}
	}

}

//计算树的深度
int caculateTreeDepth(BinaryTree *binaryTree) {
	int depthLeft, depthRight;
	if (binaryTree == NULL) {
		return 0;
	}
	depthLeft = caculateTreeDepth(binaryTree->left);
	depthRight = caculateTreeDepth(binaryTree->right);
	if (depthLeft > depthRight) {
		return depthLeft + 1;
	}
	else
	{
		return depthRight + 1;
	}
}

//按层遍历
void levelHandle(BinaryTree *binaryTree) {
	BinaryTree *array[10],*temp;
	int head = 0, tail = 0;
	if (binaryTree == NULL) {
		return;
	}

	array[++tail] = binaryTree;
	cout << "array" << tail << "值为:" << array[tail]->data<< endl;
	
	while (head != tail)
	{
		temp = array[++head];	//关键的一步
		if (temp->left != NULL) {
			array[++tail] = temp->left;
			cout << "array" << tail << "值为:" << array[tail]->data<< endl;
		}
		if (temp->right != NULL) {
			array[++tail] = temp->right;
			cout << "array" << tail << "值为:" << array[tail]->data<< endl;
		}
	}


}

//先序遍历
void preOrderHandle(BinaryTree *binaryTree) {
	if (binaryTree == NULL){
		return;
	}
	cout << "已经处理节点:" << binaryTree->data << endl;
	preOrderHandle(binaryTree->left);
	preOrderHandle(binaryTree->right);
}

//中序遍历
void inOrderHandle(BinaryTree *binaryTree) {
	if (binaryTree == NULL) {
		return;
	}	
	inOrderHandle(binaryTree->left);
	cout << "已经处理节点:" << binaryTree->data << endl;
	inOrderHandle(binaryTree->right);
}

//后序遍历
void lastOrderHandle(BinaryTree *binaryTree) {
	if (binaryTree == NULL) {
		return;
	}
	lastOrderHandle(binaryTree->left);
	lastOrderHandle(binaryTree->right);
	cout << "已经处理节点:" << binaryTree->data << endl;
}

int main() {
	BinaryTree *binaryTree = initBinaryTree("a");
	addTreeNode(binaryTree, "b");
	addTreeNode(binaryTree, "c");
	cout << endl << "深度为:"<< caculateTreeDepth(binaryTree) << endl;
	cout << endl << "按层遍历为:"<< endl;
	levelHandle(binaryTree);
	cout << endl << "先序遍历为:" << endl;
	preOrderHandle(binaryTree);
	cout << endl << "中序遍历为:" << endl;
	inOrderHandle(binaryTree);
	cout << endl << "后序遍历为:" << endl;
	lastOrderHandle(binaryTree);

	system("pause");
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值