链式二叉树的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
链式二叉树的基本操作
链式二叉树是一种经典的数据结构,由于其结构简
单、易于实现和使用等特点,被广泛应用于算法设计和程
序开发的多个领域。
本文将介绍链式二叉树的基本操作,
包括创建、插入、删除、遍历等方面,以帮助读者更好地
理解和应用该数据结构。
一、链式二叉树的创建
链式二叉树的创建过程包括两个步骤:创建节点和建
立节点间的联系。
具体步骤如下:
1、创建节点。
链式二叉树的每个节点由数据域、左子
节点和右子节点组成。
因此,创建节点需要定义一个结构
体类型,用于存储这三个元素。
例如:
struct TreeNode{ int data; // 数据
域 TreeNode* left; // 左子节点 TreeNode*
right; // 右子节点 };
2、建立节点间的联系。
链式二叉树的建立过程使用递
归算法,从根节点开始,按照先左后右的顺序递归创建子
树。
具体实现代码如下:
TreeNode* createTree(){ TreeNode* root =
nullptr; // 根节点初始化为空 int data; // 输入的数据 cin>>data; // 读
入数据 if(data == -1){ // 若数据为-
1,则表示该节点为空 root = nullptr; }
else{ // 若数据不为-1,则创建
新节点 root = new TreeNode;
root->data = data; root->left =
createTree(); // 递归创建左子树
root->right = createTree(); // 递归创建右子
树 } return root; // 返回新建树的根节点 }
二、链式二叉树的插入
链式二叉树的插入操作需要分为两类:插入根节点和
插入非根节点。
插入根节点时,只需要新建一个根节点,
并将原先的根节点作为新根节点的左子树即可。
插入非根
节点时,则需要先在树中找到待插入节点的位置,再将其
插入到对应位置处。
具体实现代码如下:
1、插入根节点:
void insertRoot(TreeNode*& root, int
data){ TreeNode* node = new TreeNode; // 新建
节点 node->data = data; // 初始化
节点数据域 node->left = root; //
原根节点成为新根节点的左子树 root = node; // 更新根节点 }
2、插入非根节点:
data){ if(root ==
nullptr){ // 树为空,则新建树 root = new TreeNode;
root->data = data; root->left = root->right = nullptr; // 新建节点的左右子节点都为
空 } else if(data <
root->data){ // 待插入节点比当前节点小,插入左子树
insertNode(root->left, data); // 递归插入左子树 }
else{ / / 待插入节点比当前节点大,插入右子树
insertNode(root->right, data); // 递归插入右子树 } }
三、链式二叉树的删除
链式二叉树的删除操作较为复杂,需要分两种情况进行讨论:删除叶子节点和删除非叶子节点。
删除叶子节点的操作比较简单,只需要将其父节点对应的指针置为空即可;删除非叶子节点则需要比较复杂的树结构调整。
具体实现代码如下:
1、删除叶子节点:
data){ if(root ==
nullptr){ //
树为空 return; } if(root->data ==
data){ // 找到
待删除节点 if(root->left == nullptr &&
root->right == nullptr){ // 待删除节点为叶子节点
delete root;
// 释放空间 root = nullptr; // 父节点对应的指针置为空 }
else{
// 待删除节点有子节点,不能直接删除
cout<<"The node is not a leaf
node!"<<endl; } } else if(data <
root->data){ // 待
删除节点在左子树中 deleteNode(root->left,
data); }
else{
// 待删除节点在右子树中
deleteNode(root->right, data); } }
2、删除非叶子节点:
data){ if(root ==
nullptr){ //
树为空 return; } if(root->data ==
data){ // 找到
待删除节点 if(root->left == nullptr &&
root->right == nullptr){ // 待删除节点为叶子节点
delete root;
// 释放空间 root = nullptr; // 父节点对应的指针置为空 } else
if(root->left ==
nullptr){ // 待删除节点只有
右子树 TreeNode* temp = root;
root = root->right;
// 指向右子树 delete temp; }
else if(root->right ==
nullptr){ // 待删除节点只有
左子树 TreeNode* temp = root;
root = root->left;
// 指向左子树 delete temp; }
else{
// 待删除节点有左右子树 TreeNode* temp
= findMin(root->right); // 查找右子树
中最小节点 root->data = temp->data; // 用右子树最小节点替换待删除节点
deleteNode(root->right, temp->data);
// 递归删除右子树中的最小节点 } }
else if(data <
root->data){ // 待
删除节点在左子树中 deleteNode(root->left,
data); }
else{
// 待删除节点在右子树中
deleteNode(root->right, data); } }
四、链式二叉树的遍历
链式二叉树有三种基本遍历方式:前序遍历、中序遍
历和后序遍历。
其中,前序遍历先访问根节点、再访问左
子树、最后访问右子树;中序遍历先访问左子树、再访问
根节点、最后访问右子树;后序遍历先访问左子树、再访
问右子树、最后访问根节点。
链式二叉树的遍历可使用递
归算法实现,具体实现代码如下:
1、前序遍历:
void preOrder(TreeNode* root){ if(root ==
nullptr){ // 树为空,返回
return; } cout<<root->data<<" "; // 访问根节点数据 preOrder(root->left);
// 递归遍历左子树 preOrder(root->right); // 递归遍历右子树 }
2、中序遍历:
void inOrder(TreeNode* root){ if(root == nullptr){ // 树为空,返回
return; } inOrder(root->left); // 递归遍历左子树 cout<<root->data<<" ";
// 访问根节点数据 inOrder(root->right); // 递归遍历右子树 }
3、后序遍历:
void postOrder(TreeNode* root){ if(root == nullptr){ // 树为空,返回
return; } postOrder(root->left); // 递归遍历左子树 postOrder(root->right);
// 递归遍历右子树 cout<<root->data<<" "; // 访问根节点数据 }
以上是链式二叉树的基本操作及使用方法,希望能对
读者有所帮助。
链式二叉树是数据结构领域中重要的一种
数据结构,不仅应用广泛,而且具有一定的研究价值。
未
来,我们有必要进一步深入研究该数据结构,拓展其应用领域。