广义表形式建树
递归
void CreateBiTree1(BiTree &T){//创建二叉树链表(递归)
if(*s == '#'){//结束建树
return;
}
else if(*s == '('){//遇左括号
s++;
if(*s == ',')//下一个为逗号,则上一个结点左孩子为空,赋空返回上一层
T = NULL;
else//下一个不为逗号,则上一个结点有左孩子,继续递归下去
CreateBiTree1(T);
}
else if(*s == ')'){//遇右括号
s++;
CreateBiTree1(T);
}
else if(*s == ','){//遇逗号
s++;
if(*s == ')')//下一个为右括号,则上一个结点右孩子为空,赋空返回上一层
T = NULL;
else//下一个不为逗号,则上一个结点有右孩子,继续递归下去
CreateBiTree1(T);
}
else{//当前为一个结点数据
T = (BiTree)malloc(sizeof(BiTNode));//申请一个结点
T->data = *s;
T->lchild = NULL;
T->rchild = NULL;
if(*(s+1) == ')' || *(s+1) == ','){//若下一个为右括号或逗号,则返回上一层
s+=2;
}
else{//否则,则依次进入左孩子和右孩子的递归
s++;
CreateBiTree1(T->lchild);
CreateBiTree1(T->rchild);
}
}
}
非递归
void CreateBiTree2(BiTree &T,char str[]){//建立二叉树链表(非递归)
BiTree S[1000];//存放父节点
int flag = 0;//存入为左孩子还是右孩子,1为左孩子,2为右孩子
int k = 0;//记入前一个父节点的存放位置
BiTree p;
p = (BiTree)malloc(sizeof(BiTNode));//申请根节点的空间
p->data = str[0];
p->lchild = NULL;
p->rchild = NULL;
int i;
for(i=1;str[i] != '#';i++){
//printf("1\n");
if(str[i] == '('){//将父节点存放入数组中,并且下一个存放左孩子
flag = 1;
S[k++] = p;
}
else if(str[i] == ','){//下一个为存放右孩子
flag = 2;
}
else if(str[i] == ')'){//将一个父节点出数组
k--;
}
else{
p = (BiTree)malloc(sizeof(BiTNode));//申请一个孩子的空间
p->data = str[i];
p->lchild = NULL;
p->rchild = NULL;
if(flag == 1){//左孩子
S[k-1]->lchild = p;
}
else if(flag == 2){//右孩子
S[k-1]->rchild = p;
}
}
}
T = S[0];//将根返回
}
求以元素为x的节点为根的子树深度
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode{
char data;//数据
struct BiTNode *lchild , *rchild;//左、右孩子
}BiTNode , * BiTree;
void InOrderBiTree(BiTree &T){//中序建立二叉树
char a;
scanf("%c",&a);
if(a == '#'){
T = NULL;
}
else{
T = (BiTree)malloc(sizeof(BiTNode));
if(!T){
printf("内存分配出现问题!!!\n");
printf("请重新启动程序!!!");
exit(0);
}
InOrderBiTree(T->lchild);//建立左孩子
T->data = a;//将数据赋值给该节点
//printf("%c ",T->data);
InOrderBiTree(T->rchild);//建立右孩子
}
}
void InOrderTraverse(BiTree T){//中序遍历输出
if(T){
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
return;
}
int Depth_X(BiTree T,char x,int flag){
int a = 0;
if(T){
if(T->data == x || flag)
{
a = 1;
flag = 1;
}
int b = Depth_X(T->lchild,x,flag);
int c = Depth_X(T->rchild,x,flag);
return b > c ? b+a : c+a;
}
return 0;
}
int main()
{
printf("请输入二叉树:");
BiTree T;
InOrderBiTree(T);
printf("中序遍历:");
InOrderTraverse(T);
char x;
printf("\n请输入x的值:");
getchar();
scanf("%c",&x);
printf("%c为根的子树深度为%d",x,Depth_X(T,x,0));
}
判断两个二叉树是否相等
int EqualityTree(BiTree A,BiTree B){//判断二叉树是否相等
if(A == NULL && B == NULL)
return 1;
else if(A == NULL || B == NULL)
return 0;
if(A != NULL && B != NULL){
if(A->data != B->data)
return 0;
else{
if(EqualityTree(A->lchild,B->lchild)&&EqualityTree(A->rchild,B->rchild))
return 1;
else
return 0;
}
}
}
交换左右子树
void Exchange(BiTree T){//交换左右子树
if(T){
Exchange(T->lchild);//先进行左子树的交换
Exchange(T->rchild);//再进行右子树的交换
BiTree A;
A = T->lchild;//自身左右子树交换
T->lchild = T->rchild;
T->rchild = A;
}
}
计算叶子节点的个数
int NumberLeafNode(BiTree T){//计算叶子节点的个数
if(T){//判断节点不为空
if(!T->lchild&&!T->rchild)
return 1;
return NumberLeafNode(T->lchild)+NumberLeafNode(T->rchild);
}
return 0;
}
计算双分支节点个数
int TwoBranched(BiTree T){//计算双分支节点个数
if(T){
int a = 0;
if(T->lchild&&T->rchild)
a = 1;
return a + TwoBranched(T->lchild) + TwoBranched(T->rchild);
}
return 0;
}
计算节点个数
int NumberNode(BiTree T){//计算节点个数
if(T){
return 1+NumberNode(T->lchild)+NumberNode(T->rchild);
}
return 0;
}
计算单分支节点个数
int SingleBranch(BiTree T){//计算单分支节点个数
if(T){
int a = 0;
if(!T->lchild&&T->rchild)
a = 1;
else if(T->lchild&&!T->rchild)
a = 1;
return a+SingleBranch(T->lchild)+SingleBranch(T->rchild);
}
return 0;
}
二叉树的高度
int Height(BiTree T){//二叉树的高度
if(T){//节点存在
int a = Height(T->lchild);
int b = Height(T->rchild);
return a>b?a+1:b+1;//返回最大的高度+1
}
return 0;
}