二叉树的其他经典算法

 


 
 

  

广义表形式建树

递归

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;
} 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值