使用C++创建一个二叉树

二叉树的创建

由于在二叉树的创建过程中,我们需要使用输入/读取的值来判定二叉树是否有左节点或者右节点。因此我们在创建的时候就需要使用指针的引用或者二重指针。
我们定义二叉树的基本结点形式如下所示:

typedef int Elemtype;
struct node
{
	Elemtype data;
	node* lchild;
	node* rchild;
};
typedef node* Node;

为了方便理解,我们来捋一遍使用二重指针在创建二叉树时的过程。
首先,我们定义了一个结构体 node
之后,我们有一个指向这个结构体的结构体指针 Node
最后,我们有一个指向这个结构体指针的二重指针 Node*
在我们创建的时候,若二叉树某个结点为空,那我们就令 Node* 指向的那个 Node 为空。而如果 Node 的值是空的,那么自然就没有结构体 node 的地方了,这个结点就相当于没有了。
那么有人可能会问,那我直接令 Node 为空不行吗。答案是不行的,因为你在使用递归法创建二叉树的时候,所改变的参数就是 Node 这个指针,也就是操作 Node 这个指针数据类型和操作其他的 int 等数据类型原理是一样的。如果直接进行传递,就相当于传递了形参,并无法将二叉树联系在一起,反而会造成漫山遍野的野指针。
我们可以简单记,操作什么类型数据,就传递高一级别的指针。
使用指针的引用原理极为简单,我们也可以用这种方法。

二重指针代码

void ini_BTree2(Node* T)
{
	string data;
	cin >> data;
	//结点不存在
	if (data == "#")
	{
		*T = NULL;
	}
	else
	{
		*T = new node;
		(*T)->data = stoi(data);
		ini_BTree((*T)->lchild);
		ini_BTree((*T)->rchild);
	}
}

指针的引用代码

void ini_BTree(Node &T)
{
	string data;
	cin >> data;
	//结点不存在
	if (data == "#")
	{
		T = NULL;
	}
	else
	{
		T = new node;
		T->data = stoi(data);
		ini_BTree(T->lchild);
		ini_BTree(T->rchild);
	}
}

二叉树的遍历

一般来讲,二叉树有三种遍历方法,分别是先序中序和后序。
先序算法步骤为:
① 访问根结点;
② 先序遍历根结点的左子树;
③ 先序遍历根结点的右子树;
中序算法步骤为:
① 中序遍历根结点的左子树;
② 访问根结点;
③ 中序遍历根结点的右子树;
后序算法步骤为:
① 后序遍历根结点的左子树;
② 后序遍历根结点的右子树;
③ 访问根结点;
以下面这个二叉树为例,我们来说明一下中序算法的遍历步骤。对于一个简单的二叉树,也就是只有根节点、左儿子右儿子的二叉树(例如图中的ABC),中序遍历的顺序是BAC。在二叉树中,所有的结点都可以认为是简单二叉树的组合,那么这样,我们就可以得到:
HDIBJEAFCG
这样一个中序遍历的二叉树
在这里插入图片描述

//先序遍历
void PreOrder(Node T)
{
	cout << T->data << endl;
	PreOrder(T->lchild);
	PreOrder(T->rchild);
}

//中序遍历
void InOrder(Node T)
{
	InOrder(T->lchild);
	cout << T->data << endl;
	InOrder(T->rchild);
}

//后序遍历
void PostOrder(Node T)
{
	PostOrder(T->lchild);
	PostOrder(T->rchild);
	cout << T->data << endl;
}

二叉树结点数量计算

int count(Node T)
{
	if (T == NULL)
		return 0;
	else
		return 1 + count(T->lchild) + count(T->rchild);
}
### 如何在 C++ 中实现二叉树的构建与初始化 在 C++ 中,可以通过定义一个 `TreeNode` 类来表示二叉树中的节点,并通过指针连接这些节点形成一棵完整的二叉树。以下是具体的实现方法: #### 定义二叉树节点结构 首先需要定义一个节点类或结构体,该结构通常包含三个部分:存储的数据、指向左子节点的指针以及指向右子节点的指针。 ```cpp struct TreeNode { int data; // 节点存储的数据 TreeNode* leftChild; // 左子节点指针 TreeNode* rightChild; // 右子节点指针 // 构造函数用于初始化节点 TreeNode(int val) : data(val), leftChild(nullptr), rightChild(nullptr) {} }; ``` 上述代码片段展示了如何定义一个简单的二叉树节点[^1]。 #### 创建并初始化二叉树 为了创建一颗二叉树,可以手动分配内存给各个节点并通过设置它们的左右孩子指针完成链接工作。下面是一个例子展示如何手工建立如下所示的一颗小型二叉树: 假设我们有这样一颗二叉树: ``` 1 / \ 2 3 / \ 4 5 ``` 对应的代码实现为: ```cpp // 手动创建上面描述的小型二叉树 TreeNode* createBinaryTree() { TreeNode* root = new TreeNode(1); root->leftChild = new TreeNode(2); root->rightChild = new TreeNode(3); root->leftChild->leftChild = new TreeNode(4); root->leftChild->rightChild = new TreeNode(5); return root; } ``` 此段代码实现了基于指定数值的手工建树过程。 #### 动态输入创建二叉树 如果希望从标准输入读取数据动态地生成二叉树,则可以根据具体需求设计不同的输入格式解析逻辑。一种常见的方式是以字符串形式给出先序遍历的结果,并用特殊字符(如 '#' 或 'null')标记空节点位置。例如对于同样的那棵小树,可能得到这样的输入:"1 2 4 null null 5 null null 3 null null" 。下面是按照这种思路编写的递归版本建树程序: ```cpp #include <queue> #include <string> using namespace std; TreeNode* buildTreeFromPreorder(queue<string>& q){ string value = q.front(); q.pop(); if(value == "#") return nullptr; TreeNode* newNode = new TreeNode(stoi(value)); newNode->leftChild = buildTreeFromPreorder(q); newNode->rightChild = buildTreeFromPreorder(q); return newNode; } TreeNode* readAndBuild(){ queue<string> inputQueue; string s; while(cin >> s && s != "."){ inputQueue.push(s); } return buildTreeFromPreorder(inputQueue); } ``` 这里提供了另一种更灵活的方法去根据用户的输入实时构造出相应的二叉树实例[^4]。 以上就是关于如何利用C++语言来进行基础版或者高级定制化的二叉树对象创建介绍[^3]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值