二叉树的创建和遍历---C++实现

1. 二叉树概念

二叉树是一颗树,其中每个节点都不能有多于2个的子树,一般会有左子树和右子树,两者均可能为空。

二叉树实际上是图。

2. 二叉树节点和类的声明

创建树之前需要先声明一个树的结点。

//声明树结点
typedef struct node {
	char element; //结点值
	struct node* left; //左子树
	struct node* right; //右子树

}TreeNode;

接下来声明一个二叉树类,包括有二叉树的创建和遍历等操作。

class BinTree
{
public:
	BinTree();
	~BinTree();
	void createTree(); //创建二叉树
	void preorderBinaryTree();
	void inorderBinaryTree();
	void postorderBinaryTree();
private:
	TreeNode* root;

	void insertTreeNode(char ele); //插入树结点
	void preorderBinTree(TreeNode *root); //前序遍历树
	void inorderBinTree(TreeNode *root); //中序遍历树
	void postorderBinTree(TreeNode *root); //后序遍历树
};

3. 创建二叉树的函数实现

insertTreeNode()函数将节点值作为输入,在函数体中先声明一个树节点,申请相应的内存空间,创建出来以后让左右子树为null (让指针初始化的时候指向NULL是一个很好的习惯)。如果树的根节点为空,则将当前树节点作为根节点,否则按照约束条件(左子树 < 父节点 < 右子树)来插入树节点,判断左右子树是否为空,如果为空,则将当前树节点作为左子树或右子树根节点。

void BinTree::createTree() {
	int n;
	cout << "树中有多少个节点?" << endl;
	cin >> n;
	cout << "请输入树节点:" << endl;
	for (int i = 0; i < n; i++)//输入n个数并创建这个树
	{
		char ele;
		cin >> ele;
		insertTreeNode(ele);
	}
	cout << "二叉树构建完毕!" << endl;
}
void BinTree::insertTreeNode(char ele) {
	TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
	node->element = ele;
	node->left = NULL;
	node->right = NULL;
	if (root==NULL)//判断树是不是空树
	{
		root = node;
	}
	else {//不是空树
		TreeNode* temp = root;从树根开始
		while (temp!=NULL)
		{
			if (ele < temp->element)//小于就进左子树
			{
				if (temp->left==NULL)
				{
					temp->left = node;
					return;
				}
				else
				{
					temp = temp->left;
				}
			}
			else//否则就进右子树
			{
				if (temp->right==NULL)
				{
					temp->right = node;
					return;
				}
				else
				{
					temp=temp->right;
				}
			}
		}
		
	}
	return;
}

 

4. 遍历二叉树

(1)前序遍历。前序遍历按照采用递归的方法来遍历二叉树,遵循“根->左->右”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。

//前序遍历:根左右
void BinTree::preorderBinTree(TreeNode *root) {
	if (!root) return;
	else {
		cout << root->element;
		preorderBinTree(root->left);
		preorderBinTree(root->right);
	}
}
void BinTree::preorderBinaryTree() {
	preorderBinTree(root);
	cout << endl;
 }

(2)中序遍历。中序遍历按照采用递归的方法来遍历二叉树,遵循“左->根->右”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。

//中序遍历:左根右
void BinTree::inorderBinTree(TreeNode *root) {
	if (!root) return;
	else {
		inorderBinTree(root->left);
		cout << root->element;
		inorderBinTree(root->right);
	}
}
void BinTree::inorderBinaryTree() {
	inorderBinTree(root);
	cout << endl;
}

(3)后序遍历。后序遍历按照采用递归的方法来遍历二叉树,遵循“左->右->根”的遍历顺序,遍历函数将树的根节点作为输入,递归遍历。

//后序遍历:左右根
void BinTree::postorderBinTree(TreeNode *root) {
	if (!root) return;
	else {
		postorderBinTree(root->left);
		postorderBinTree(root->right);
		cout << root->element;
	}
}
void BinTree::postorderBinaryTree() {
	postorderBinTree(root);
	cout << endl;
}

5. main()函数实现

int main() {
	cout << "创建二叉树:" << endl;
	BinTree tree;
	tree.createTree();
	tree.preorderBinaryTree();//前序遍历
	tree.inorderBinaryTree();//前序遍历
	tree.postorderBinaryTree();//前序遍历

	system("pause");
	return 0;
}

6. 案例

构建的二叉树,如图所示:

输入:c b d a

则,运行结果如下图所示:

7. 总结

(1) 在VS项目中,类的定义和成员函数实现分离的时候,除了包含.h文件外,还要将所有函数的实现均放在.cpp文件中,包括构造函数和析构函数。

(2) 在此实现二叉树的小项目练习过程中,自己重温了C++的语法和部分数据结构算法,温故而知新。

(3) 其他,参考博客:https://blog.csdn.net/qq_42011541/article/details/80547098

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值