文件btree.h
#pragma once
#ifndef BTREE_H
#define BTREE_H
#include<iostream>
using namespace std;
#define MaxSize 100
//定义结点类型
//template<typename T>
typedef struct node{
char data; //数据元素
struct node *lchild; //左孩子结点
struct node *rchild; //右孩子结点
}BTNode;
//template<typename T>
class BTree{
public:
BTree(); //构造函数
void CreateBTree(char *str); //创建二叉树
BTNode *LchildNode(BTNode *p); //找结点的左孩子结点
BTNode *RchildNode(BTNode *p); //找结点的右孩子结点
int LenghBTree(); //
BTNode *FindNode(char x); //查找值为x的结点
void DispBTree(); //打印二叉树
private:
int LengthBTree(BTNode *p); //求二叉树的高度
BTNode *FindNode(BTNode *b,char x); //查找值为x的结点
void DispBTree(BTNode *b); //打印二叉树
private:
BTNode *b;
};
BTree::BTree(){
}
//创建二叉树
void BTree::CreateBTree(char *str){
BTNode *St[MaxSize],*p = NULL;
int top = -1; //栈指针,初始为-1
int j = 0; //字符串位置指针,初始为0
int k; //
char ch; //
b = NULL; //二叉树初始时,b为空
ch = str[j]; //字符串第一个字符
//创建二叉树
while(ch != '\0'){
switch(ch){
case '(':{
k = 1; // k=1表示此结点为左孩子结点
top ++; //进栈
St[top] = p; //更新当前父亲结点
break;
}
case ')':{
top --; //出栈
break;
}
case ',':{
k = 2; //右孩子结点
break;
}
default:{
p = (BTNode *)malloc(sizeof(BTNode));
p->lchild = p->rchild = NULL;
p->data = ch;
if(b == NULL){
b = p; //如果二叉树为空,则*p为二叉树的根节点
}
else{
switch(k){
case 1:St[top]->lchild = p;break;
case 2:St[top]->rchild = p;break;
}
}
}
}
j++;
ch = str[j];
}
}
//private:查找值为x的结点
BTNode *BTree::FindNode(BTNode *b,char x){
BTNode *p;
if(b == NULL){
return NULL; //二叉树为空
}
if(b->data == x){
return b; //找到值为x的结点
}
p = FindNode(b->lchild,x); //查看左结点是否符合
if(p != NULL){
return p;
}
else{
return(FindNode(b->rchild,x)); //查看右结点是否符合
}
}
//public:查找值为x的结点
BTNode *BTree::FindNode(char x){
return FindNode(b,x);
}
///找结点的左孩子结点
BTNode * BTree::LchildNode(BTNode *p){
return (p->lchild);
}
///查找结点的右孩子结点
BTNode *BTree::RchildNode(BTNode *p){
return (p->rchild);
}
///求二叉树的高度
int BTree::LengthBTree(BTNode *b){
int R,L;
if(b == NULL){
return 0; //二叉树为空,高度为0
}
else{
R = LengthBTree(b->rchild);
L = LengthBTree(b->lchild);
if(R > L){
return (R+1);
}
else{
return (L+1);
}
}
}
///返回二叉树高度
int BTree::LenghBTree(){
return BTree::LengthBTree(b);
}
//private:打印二叉树
void BTree::DispBTree(BTNode *b){
if(b != NULL){
cout<<b->data;
if(b->lchild != NULL || b->rchild != NULL){
cout<<'('; //如果有孩子结点,则输出‘(’
DispBTree(b->lchild); //输出左孩子结点
if(b->rchild != NULL){
cout<<','; //如果有右孩子结点,则输出‘,’
}
DispBTree(b->rchild); //输出右孩子结点
cout<<')'; //输出‘)’
}
}
}
//public:打印二叉树
void BTree::DispBTree(){
DispBTree(b);
}
#endif