【C++】二叉树采用二叉链表存储,实现如下算法:1.创建一颗二叉树;2.交换该二叉树所有节点的左右子数;3.求节点x在二叉树中的双亲节点;4.计算二叉树的高度和最大宽度;5.二叉树的遍历和销毁

#include <iostream>
#include <stdlib.h>
using namespace std;
const int maxsize=100;
int len;
typedef struct BTNode{
	char data;
	struct BTNode* lChild;
	struct BTNode* rChild;
}BTNode,*BiTree;
void creatBiTree(BiTree* bt){//先序遍历递归构建二叉树(等同二级指针:BTNode** bt) 
	char ch;
	scanf("%c",&ch);
	if(ch=='#') *bt=NULL;
	else{
		*bt=(BiTree)malloc(sizeof(BTNode));
		//*bt=new BTNode;
		(*bt)->data=ch;
		creatBiTree(&((*bt)->lChild));
		creatBiTree(&((*bt)->rChild));
	} 
}
void CreatBiTree(BiTree &bt){//C++专属取地址写法 
	char ch;
	scanf("%c",&ch);
	if(ch=='#') bt=NULL;//'#'表示当前孩子为空 
	else{
		bt=new BTNode;
		bt->data=ch;
		CreatBiTree(bt->lChild);
		CreatBiTree(bt->rChild);
	} 
}
BiTree creatBiTree(){//返回值写法 
	char ch;
	BTNode* bt=NULL;
	scanf("%c",&ch);
	if(ch=='#') return NULL;//'#'表示当前孩子为空 
	else{
		bt=(BiTree)malloc(sizeof(BTNode));
		bt->data=ch;
		bt->lChild=creatBiTree();
		bt->rChild=creatBiTree();
		return bt;
	} 
}
void exchange(BTNode* bt){//交换左右孩子节点 
	if(bt){
		BTNode* t=bt->lChild;
		bt->lChild=bt->rChild;
		bt->rChild=t;
		exchange(bt->lChild);
		exchange(bt->rChild);
	}
}
void preVisit(BTNode* bt){//先序遍历 
	if(bt){
		cout<<bt->data;
		preVisit(bt->lChild);
		preVisit(bt->rChild);
	} 
}
void levelVisit(BTNode* bt){
	int front=-1,rear=-1;
	BTNode* que[maxsize];
	BTNode* p;
	que[++rear]=bt;
	while(front!=rear){
		p=que[++front];
		cout<<p->data;
		if(p->lChild) que[++rear]=p->lChild;
		if(p->rChild) que[++rear]=p->rChild;		    
	}
}	
int getLevelSize(BTNode* bt,int k){//求第k层节点数 
	if(!bt) return 0;
	if(k==1) return 1;
	return getLevelSize(bt->lChild,k-1)+getLevelSize(bt->rChild,k-1);
}
int getLeafNum(BTNode* bt){//求叶子节点数 
	if(!bt) return 0;
	if(!bt->lChild&&!bt->rChild) return 1;
	return getLeafNum(bt->lChild)+getLeafNum(bt->rChild);
}
int getDepth(BTNode* bt){
	
	if(!bt) return 0;
	int ld=getDepth(bt->lChild);
	int rd=getDepth(bt->rChild);
	return (ld>=rd? ld:rd)+1;
}
int getWidth(BTNode* bt){//求最大宽度(所有层中节点数的最大值) 
	int front=-1,rear=-1;
	int curnum=0,maxnum=0,last=0;
	//curnum:当前层的节点数,maxnum:最大节点数(宽度),last:当前层最后一个节点的下标 
	BTNode* que[maxsize];
	BTNode* p;
	que[++rear]=bt;
	while(front!=rear){
		p=que[++front];
		curnum++;
		if(p->lChild) que[++rear]=p->lChild;
		if(p->rChild) que[++rear]=p->rChild;
		if(front==last){//重点:当出队元素等于本层最后一个节点时更新 
			maxnum=max(maxnum,curnum);
			curnum=0;
			last=rear;//下一层的last就是入队的最后一个元素的下标 
		}
	}
	return maxnum; 
}
BTNode* findNode(BTNode* bt,char x){//找值为x的节点 
	if(!bt) return NULL;
	if(bt->data==x)return bt;
	BTNode* lnode=findNode(bt->lChild,x);
	if(lnode) return lnode;
	return findNode(bt->rChild,x);
}
BTNode* getFather(BTNode* bt,char x){//找值为x的双亲节点 
	if(!bt) return NULL;
	if(!bt->lChild&&!bt->rChild) return NULL;
	if(bt->lChild&&bt->lChild->data==x) return bt;
	if(bt->rChild&&bt->rChild->data==x) return bt;
	BTNode* lfa=getFather(bt->lChild,x);
	if(lfa) return lfa;
	return getFather(bt->rChild,x);
}
void destoryBiTree(BTNode* bt){
	if(!bt) return;
	destoryBiTree(bt->lChild);
	destoryBiTree(bt->rChild);
	delete(bt);
}
int main(){
	BTNode* T=NULL;
	CreatBiTree(T);
	levelVisit(T);
	cout<<endl;
	cout<<"h="<<getDepth(T)<<endl;
	cout<<"w="<<getWidth(T)<<endl;
	char x;
	cout<<"x=";cin>>x;
	BTNode* fa=getFather(T,x);
	if(!fa) cout<<"x的双亲节点未找到"<<endl;
	else cout<<"fa="<<fa->data<<endl; 
	return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值