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);
}