数据结构-二叉链(C语言)

1.函数的声明和自定义

btnode.h

#pragma once
#include<stdio.h>
#include<stdlib.h>

#define MaxSize 50

typedef char ElemType;

typedef struct node {
	ElemType data;
	struct node* lchild;
	struct node* rchild;
}BTNode;

#ifndef __BTNODE_H__
#define __BTNODE_H__

//创建二叉树
void CreateBTree(BTNode*& b, char* str);

//销毁二叉树
void DestroyBTree(BTNode*& b);

//查找结点
BTNode* FindNode(BTNode* b, ElemType x);

//找孩子节点
BTNode* LchildNode(BTNode* p);

BTNode* RchildNode(BTNode* p);

//求高度
int BTHeight(BTNode* b);

//输出二叉树
void DispBTree(BTNode* b);
#endif // !__BTNODE_H__

2.二叉栈的各函数操作

BTNode.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "btnode.h"

//创建二叉树
void CreateBTree(BTNode*& b, char* str) {
	BTNode* St[MaxSize];						//St数组作为顺序栈
	BTNode* p=NULL;								//p用于开辟节点
	int top = -1;								//栈顶指针
	int j = 0; 
	int k;
	char ch;
	b = NULL;									//初始时二叉链为空
	ch = str[j];								//获取字符串的首个字符
	while (ch != '\0') {						//遍历整个字符串
		switch (ch) {
		case '(':								//检测到'('代表有左孩子
			top++;								//栈顶指针往后移
			St[top] = p;						//栈中存入刚开辟的节点
			k = 1;								//k=1,判断是有左孩子
			break;
		case ')':								//检测到')',代表该子树结束了
			top--;
			break;
		case ',':								//检测到‘,’代表有右孩子
			k = 2;								//k=2,判断有右孩子
			break;
		default:
			p = (BTNode*)malloc(sizeof(BTNode));		//创建一个节点,指针p指向它
			p->data = ch;								//将ch的字符赋值给节点p
			p->lchild = p->rchild = NULL;				//将该节点的左右孩子指针赋空
			if (b == NULL) {
				b = p;
			}
			else {
				switch (k) {
				case 1:
					St[top]->lchild = p;			//新建节点作为栈顶节点的左孩子
					break;
				case 2:
					St[top]->rchild = p;			//新建节点作为栈顶节点的右孩子
					break;
				}
			}
			break;
		}
		j++;
		ch = str[j];
	}
}
//销毁二叉树
void DestroyBTree(BTNode*& b) {
	if (b != NULL) {
		DestroyBTree(b->lchild);					//递归一个个节点销毁
		DestroyBTree(b->rchild);
		free(b);
	}
}
//查找结点
BTNode* FindNode(BTNode* b, ElemType x) {
	BTNode* p;
	if (b == NULL) {								//判断是否为空树
		return NULL;
	}else if(b->data==x){							//如果树中有值等于你要找的值,返回该值
		return b;
	}
	else {											//往下继续寻找该值
		p = FindNode(b->lchild, x);					//往左子树找
		if (p != NULL) {							//且不为空,代表在左子树找到了
			return p;
		}
		else {
			return FindNode(b->rchild, x);			//往右子树找
		}
	}
}
//找孩子节点
BTNode* LchildNode(BTNode* p) {
	return p->lchild;
}

BTNode* RchildNode(BTNode* p) {
	return p->rchild;
}
//求高度
int BTHeight(BTNode* b) {
	int lchildh, rchildh;
	if (b == NULL) {
		return 0;									//空树高度为0
	}
	else {
		lchildh = BTHeight(b->lchild);				//求左子树高度
		rchildh = BTHeight(b->rchild);				//求右子树高度
		return(lchildh > rchildh ? (lchildh + 1) : (rchildh + 1));	//哪个大就是树的高度
	}
}
//输出二叉树
void DispBTree(BTNode* b) {
	if (b != NULL) {								//树判空
		printf("%c", b->data);						//输出值
		if (b->lchild != NULL || b->rchild != NULL) {//如果左右子树都不为空就继续输出
			printf("(");							//输出(继续输出左子树
			DispBTree(b->lchild);
			if (b->rchild != NULL) {				//判断右子树是否为空
				printf(",");						//不为空输出,然后打印右孩子的值
			}
			DispBTree(b->rchild);
			printf(")");							//最后加上)
		}
	}
}

3.运行

TEST.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"btnode.h"

int main() {
	BTNode* b;
	ElemType x;
	char str[] = "A(B(D(,G)),C(E,F)";

	int i = 0;
	CreateBTree(b, str);
	printf("该节点的地址为:%c\n",(FindNode(b, 'D'))->data);
	printf("树的高度为:%d\n",BTHeight(b));
	DispBTree(b);
}

4.结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值