创建头文件:#include"btree.h"
typedef char T;
typedef struct node{
T data;
struct node * lchild;
struct node * rchild;
}BTNode;
二叉树创建思路:
假设采用括号表示法表示的二叉树字符串str是正确的,用ch扫描str,其中只有4类字符,其中处理方式如下:
- 若ch="(":表示前面刚创建的节点*p存在孩子节点,需要将其进入堆栈,以便建立它和其孩子节点的关系。(如果一个节点刚创建完毕,其后一个字符不是左括号,表示该节点时叶子节点,不需要将其进入堆栈)。然后开始处理该节点的左孩子,因此置k=1,表示其后创建的节点将作为这个节点(栈顶节点)的左孩子节点。
- 若ch=")",表示以栈顶节点为根节点的子树创建完毕,将其退栈。
- 若ch=",",表示开始处理栈顶节点的右孩子节点。
- 其他情况:只能是单个字符,表示要创建一个节点*p,根据k值建立它与栈顶节点之间的联系,当k=1时,表示这个节点是栈顶节点的左孩子节点,当k=2时,表示这个节点时栈顶节点的右孩子节点。
如此循环,直到str处理完毕,算法中使用一个St栈保存双亲节点,top为栈顶指针,k指定其后处理的节点是双亲节点(栈顶节点)的左孩子(k=1)还是右孩子(k=2)。
创建源文件:#include"btree.cpp"
#include"btree.h"
#include<malloc.h>
#include<stdio.h>
#define MaxSize 100
//创建二叉树
void CreateBTNode(BTNode * &b, char * str){
BTNode * St[MaxSize], *p;
int top = -1, k, j = 0;
b = NULL;
char ch = str[j];
while(ch != '\0'){
switch(ch){
case '(': top++; St[top] = p; k = 1; break;
case ')': top--; break;
case ',': k = 2; break;
default: p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch; 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;
}
}
}
j++;
ch = str[j];
}
}
//输出二叉树
void DispBTNode(BTNode * b){
if(b != NULL){
printf("%c", b->data);
if(b->lchild != NULL || b ->rchild != NULL){
printf("(");
DispBTNode(b->lchild);
if(b->rchild != NULL){
printf(",");
}
DispBTNode(b->rchild);
printf(")");
}
}
}
//查找节点
BTNode *FindNode(BTNode * b, T 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 BTNodeHeight(BTNode * b){
int lchild, rchild;
if(b == NULL){
return 0;
}else{
lchild = BTNodeHeight(b->lchild);
rchild = BTNodeHeight(b->rchild);
return(lchild > rchild)?(lchild + 1):(rchild + 1);
}
}
创建测试文件:
#include<stdio.h>
#include"btree.cpp"
int main()
{
BTNode *b;
CreateBTNode(b,"A(B(D,E),C(,F))");
printf("btree:");
DispBTNode(b);
printf("\n");
char x = 'B';
BTNode * p = b;
printf("Find->%c=%c\n", x, *FindNode(b, x));
printf("%c->lchildNode=", *p);
printf("%c\n", *LchildNode(p));
printf("%c->rchildNode=", *p);
printf("%c\n", *RchildNode(p));
printf("btreeHight=%d\n", BTNodeHeight(b));
return 0;
}