二叉树(链式存储)基本操作

目录

1.二叉树链式存储的结构体定义

2.询问法创建二叉树

3.补空法创建二叉树

4.访问结点

5.先序遍历二叉树(根左右)

6.中序遍历二叉树(左根右)

7.后序遍历二叉树(左右根)

8.层序遍历二叉树(按照层次从左到右依次遍历)

代码部分

运行部分


操作部分

1.二叉树链式存储的结构体定义

2.询问法创建二叉树

3.补空法创建二叉树

4.访问结点

5.先序遍历二叉树(根左右)

6.中序遍历二叉树(左根右)

7.后序遍历二叉树(左右根)

8.层序遍历二叉树(按照层次从左到右依次遍历)

代码部分

//二叉树的链式存储
//核心:n个结点的二叉链表共有n+1个空链域
/**/
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
typedef char ElemType;
//1.结构体定义
typedef struct Bnode {
	ElemType data;
	struct Bnode* lchild, * rchild, * parent;//左孩子指针,右孩子指针,双亲指针
}Bnode, * Btree;
//2.(询问法)创建二叉树
void CreateBtree_ask(Btree& T) {
	char check;
	T = (Bnode*)malloc(sizeof(Bnode));
	cout << "请输入结点信息:" << endl;
	cin >> T->data;
	cout<<"是否添加"<<T->data<<"的左孩子?(Y / N)"<<endl;
	cin >> check;
	if (check == 'Y')
		CreateBtree_ask(T->lchild);
	else
		T->lchild = NULL;
	cout << "是否添加" << T->data << "的右孩子?(Y / N)" << endl;
	cin >> check;
	if (check == 'Y')
		CreateBtree_ask(T->rchild);
	else
		T->rchild = NULL;
}
//3.(补空法)创建二叉树
//补空法是指如果左子树或右子树为空时,则用特殊字符补空,如“#”,
//然后按照根,左子树,右子树的顺序,得到先序遍历序列,根据该序列递归创建二叉树
//算法步骤:(1)输入补空后的二叉树先序遍历序列
//          (2)如果ch="#",T=NULL;否则创建一个新节点T,令T->data=ch;递归创建T的左子树,递归创建T的右子树
void CreateBtree_fill(Btree &T) {
	//例ABD##E##CF#G###
	char ch;
	cin >> ch;
	if (ch == '#')
		T = NULL;
	else {
		T = new Bnode;	//生成根结点
		T->data = ch;
		CreateBtree_fill(T->lchild);	//递归生成左子树
		CreateBtree_fill(T->rchild);	//递归生成右子树
	}
}
//4.访问结点
void Visit(Btree T)
{
	cout << T->data <<endl;
}
//5.先序遍历---根左右
void PreOrder(Btree T) {
	if (T != NULL) {
		Visit(T);	//遍历根结点
		PreOrder(T->lchild);	//遍历左孩子
		PreOrder(T->rchild);	//遍历左孩子
	}
}
//6.中序遍历---左根右
void InOrder(Btree T) {
	if (T != NULL) {
		InOrder(T->lchild);	//遍历左孩子
		Visit(T);	//遍历根结点
		InOrder(T->rchild);	//遍历右孩子
	}
}
//7.后序遍历---左右根
void PostOrder(Btree T) {
	if (T != NULL) {
		PostOrder(T->lchild);	//遍历左孩子
		PostOrder(T->rchild);	//遍历右孩子
		Visit(T);	//遍历根结点
	}
}
//8.层序遍历:按照层次从左到右依次遍历
//算法思想:
//1.初始化一个辅助队列
//2.根节点入队
//3.若队列非空,则队头结点出队,访问该结点,并将该结点的孩子从左到右依次入队(如果有的话)
//4.循环2,3直到队空
bool LevelTraverse(Btree T) {
	Btree p;
	if (!T)
		return false;
	queue<Btree>Q;
	Q.push(T);
	while (!Q.empty()) {
		p = Q.front();
		Q.pop();
		cout << p->data << " ";
		if (p->lchild) 
			Q.push(p->lchild);//左孩子指针入队
		if (p->rchild) 
			Q.push(p->rchild);//右孩子指针入队
	}
	return true;
}

int main() {
	Btree T;
	//询问法创建二叉树
	//CreateBtree_ask(T);
	//补空法创建二叉树
	cout << "请输入二叉树:" << endl;
	CreateBtree_fill(T); //输入:ABD##E##CF#G###
	//先序遍历
	cout << "先序遍历的结果为:" << endl;
	PreOrder(T);
	//中序遍历
	cout << "中序遍历的结果为:" << endl;
	InOrder(T);
	//后序遍历
	cout << "后序遍历的结果为:" << endl;
	PostOrder(T);
	//层序遍历
	cout<< "层序遍历的结果为:" << endl;
	LevelTraverse(T);
}

运行部分

补空法创建二叉树

补空法算法思想:

        补空法是指如果左子树或右子树为空时,则用特殊字符补空,如“#”,然后按照根,左子树,右子树的顺序,得到先序遍历序列,根据该序列递归创建二叉树
算法步骤:(1)输入补空后的二叉树先序遍历序列
                  (2)如果ch="#",T=NULL;否则创建一个新节点T,令T->data=ch;递归创建T的左子树,递归创建T的右子树

 询问法创建二叉树

 

 

 下面是该树的形状

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
二叉树链式存储结构是通过指针实现数据结构,每个节点包括一个数据域和两个指针域,分别指向左子和右子。下面是二叉树链式存储结构的创建及基本运算。 1. 创建二叉树 二叉树可以通过手动输入或者读入数据来创建。下面是手动输入创建二叉树的代码: ```c++ #include <iostream> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; void createTree(TreeNode* &root) { int val; cin >> val; if (val == -1) { // 输入-1表示该节点为空 root = NULL; } else { root = new TreeNode(val); createTree(root->left); createTree(root->right); } } ``` 2. 遍历二叉树 二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。下面是三种遍历方式的代码实现: ```c++ // 前序遍历 void preOrder(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right); } // 中序遍历 void inOrder(TreeNode* root) { if (root == NULL) return; inOrder(root->left); cout << root->val << " "; inOrder(root->right); } // 后序遍历 void postOrder(TreeNode* root) { if (root == NULL) return; postOrder(root->left); postOrder(root->right); cout << root->val << " "; } ``` 3. 插入节点 二叉树的插入操作是向二叉树中插入一个新节点。下面是插入操作的代码实现: ```c++ void insertNode(TreeNode* &root, int val) { if (root == NULL) { root = new TreeNode(val); return; } if (val < root->val) { insertNode(root->left, val); } else { insertNode(root->right, val); } } ``` 4. 删除节点 二叉树的删除操作是将一个节点从二叉树中删除。删除操作需要考虑三种情况:删除的节点没有子节点、删除的节点有一个子节点、删除的节点有两个子节点。下面是删除操作的代码实现: ```c++ void deleteNode(TreeNode* &root, int val) { if (root == NULL) return; if (root->val == val) { if (root->left == NULL && root->right == NULL) { // 没有子节点 delete root; root = NULL; } else if (root->left == NULL || root->right == NULL) { // 有一个子节点 TreeNode* temp = root->left ? root->left : root->right; delete root; root = temp; } else { // 有两个子节点 TreeNode* temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->val = temp->val; deleteNode(root->right, temp->val); } } else if (val < root->val) { deleteNode(root->left, val); } else { deleteNode(root->right, val); } } ``` 以上是二叉树链式存储结构的创建及基本运算的代码实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自律的光电人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值