版权声明:Sock的blog, 可以偷看但不可以偷走哦 https://blog.csdn.net/qq_42957923/article/details/85339176
二叉树的基本操作
在了解了二叉树的概念之后, 大家会发现二叉树的其实是一个递归的思维, 因此它的创建, 遍历以及销毁等操作可以用递归来实现
具体实现
定义一个二叉树
//定义一个二叉链表
typedef struct Node {
char data;
struct Node* lchild;
struct Node* rchild;
}BitNode, *BiTree;
递归创建一个二叉树
//递归创建一个二叉树
void CreateBiTree(BiTree* T) {
char ch = 0;
scanf("%c", &ch);
if (ch == ' ') {
*T = NULL;
} else {
*T = (BiTree)malloc(sizeof(BitNode));
if (!(*T)) {
exit(0);
}
(*T)->data = ch;
CreateBiTree(&((*T)->lchild));
CreateBiTree(&((*T)->rchild));
}
}
二叉树的左插入操作
//二叉树的左插入操作
//将 c 子树插入到 p 指向结点的左孩子
int InsertLeftChild(BiTree p, BiTree c) {
if (p) {
c->rchild = p->lchild;
p->lchild = c;
return 1;
}
return 0;
}
二叉树的右插入操作
//二叉树的右插入操作
//将 c 子树插入到 p 指向结点的右孩子
int InsertRightChild(BiTree p, BiTree c) {
if (p) {
c->rchild = p->rchild;
p->rchild = c;
return 1;
}
return 0;
}
返回二叉树指定结点的指针
//返回二叉树指定结点指针的操作
BiTree Point(BiTree T, char e) {
//定义一个队列存放二叉树中结点的指针
BiTree Q[MAXSIZE] = { NULL };
//初始化队列
int front = 0, rear = 0;
BiTree adjust;
if (T) {
Q[rear] = T;
++rear;
//如果队列不为空就执行此操作
while (front != rear) {
adjust = Q[front];
++front;
if (adjust->data == e) {
return adjust;
}
//将每个根结点的左孩子入队
if (adjust->lchild) {
Q[rear] = adjust->lchild;
++rear;
}
//将每个根结点的右孩子入队
if (adjust->rchild) {
Q[rear] = adjust->rchild;
++rear;
}
}
}
return NULL;
}
返回二叉树指定结点的左孩子操作
//返回二叉树指定结点的左孩子的操作
char LeftChild(BiTree T, char e) {
BiTree adjust = NULL;
if (T) {
adjust = Point(T, e);
if (adjust && adjust->lchild) {
return adjust->lchild->data;
}
}
return 0;
}
返回二叉树指定结点的右孩子操作
//返回二叉树指定结点的右孩子的操作
char RightChild(BiTree T, char e) {
BiTree adjust = NULL;
if (T) {
adjust = Point(T, e);
if (adjust && adjust->rchild) {
return adjust->rchild->data;
}
}
return 0;
}
递归销毁二叉树
//销毁二叉树
void Destroy(BiTree* T) {
if (*T) {
if ((*T)->lchild) {
Destroy(&((*T)->lchild));
}
if ((*T)->rchild) {
Destroy(&((*T)->rchild));
}
free(*T);
*T = NULL;
}
}
二叉树的左删除操作
//二叉树的左删除操作
void LiftDelete(BiTree p) {
if (p) {
Destroy(&(p->lchild));
}
}
二叉树的右删除操作
//二叉树的右删除操作
void RightDelete(BiTree p) {
if (p) {
Destroy(&(p->rchild));
}
}
二叉树的先序遍历
//二叉树的先序遍历
void Traverse(BiTree T) {
if (T) {
printf("%2c", T->data);
Traverse(T->lchild);
Traverse(T->rchild);
}
}
测试
int main() {
BiTree t1;
CreateBiTree(&t1);
printf("\n**************************\n");
Traverse(t1);
printf("\n**************************\n");
BiTree p;
p = Point(t1, 'B');
BiTree q = (BiTree)malloc(sizeof(BitNode));
if (!q) {
exit(0);
}
q->data = 'Z';
q->lchild = NULL;
q->rchild = NULL;
if (InsertLeftChild(p, q));
Traverse(t1);
printf("\n**************************\n");
RightDelete(p);
Traverse(t1);
printf("\n**************************\n");
char c = LeftChild(t1, 'B');
printf("%c\n", c);
Destroy(&t1);
if (!t1) {
printf("OK\n");
}
system("pause");
return 0;
}
效果图
希望该篇文章能对大家有所帮助, 同时很真诚的接受大家的评论和建议