二叉树的相关操作代码(继续补全中)

27 篇文章 1 订阅
11 篇文章 0 订阅
#ifndef BITREEOPERATION_H
#define BITREEOPERATION_H
#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<queue>
typedef char ElemType;

typedef struct BiNode{
	ElemType data;
	struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

//先序建立二叉树
int PreOrderCreateBiTree(BiTree& Root){
	char ch;
	scanf("%c",&ch);
	if(ch==' ')
		Root=NULL;
	else{
		Root=(BiTree)malloc(sizeof(BiNode));
		Root->data=ch;//生成根节点
		PreOrderCreateBiTree(Root->lchild);//构造左子树
		PreOrderCreateBiTree(Root->rchild);//构造右子树
	}
	return 0;
}

//先序的递归遍历
void PreOrderTraverse(BiTree Root){
	if(Root!=NULL){
		printf("%c",Root->data);//访问根节点
		PreOrderTraverse(Root->lchild);//先序遍历左子树
		PreOrderTraverse(Root->rchild);//先序遍历右子树
	}
}

//中序的递归遍历
void InOrderTraverse(BiTree Root){
	if(Root!=NULL){
		PreOrderTraverse(Root->lchild);//中序遍历左子树
		printf("%c",Root->data);//访问根节点
		PreOrderTraverse(Root->rchild);//中序遍历右子树
	}
}

//后序的递归遍历
void PostOrderTraverse(BiTree Root){
	if(Root!=NULL){
		PreOrderTraverse(Root->lchild);//后序遍历左子树
		PreOrderTraverse(Root->rchild);//后序遍历右子树
		printf("%c",Root->data);//访问根节点
	}
}

//先序的非递归遍历,使用到栈结构
void PreOrderNonRecur(BiTree Root){
	std::stack<BiTree> cstack;
	BiTree p=Root;
	while(p||!cstack.empty()){
		if(p){//根指针进栈,访问根节点,遍历左子树
			cstack.push(p);
			printf("%c",p->data);
			p=p->lchild; 
		}else{//根指针退栈,遍历右子树
			p=cstack.top();
			cstack.pop();
			p=p->rchild;
		}
	}

}

//中序的非递归遍历
void InOrderNonRecur(BiTree Root){
	if(Root!=NULL){
		std::stack<BiTree> cstack;
		BiTree p=Root;
		while(p||!cstack.empty()){
			if(p){//根指针进栈,遍历左子树
				cstack.push(p);			
				p=p->lchild;
			}else{//根指针退栈,访问根节点,遍历右子树
				p=cstack.top();
				cstack.pop();
				printf("%c",p->data);			
				p=p->rchild;
			}
		}
	}

}
//后序的非递归遍历比较麻烦些,暂时不讨论

//层序遍历,使用到队列结构
void levelOrderTraverse(BiTree Root){
	if(Root!=NULL){
		std::queue<BiTree> cqueue;
		BiTree p=Root;
		cqueue.push(p);
		while(!cqueue.empty()){
			p=cqueue.front();
			cqueue.pop();//根节点出队列
			printf("%c",p->data);
			if(p->lchild!=NULL)
				cqueue.push(p->lchild);
			if(p->rchild!=NULL)
				cqueue.push(p->rchild);
		}
	}
}

//递归求树的高度
int getBiTreeHeight(BiTree Root){
	if(Root==NULL)
		return 0; //空树返回0
	else{
		int lheight=getBiTreeHeight(Root->lchild);//递归求左子树高度
		int rheight=getBiTreeHeight(Root->rchild);//递归求右子树高度
		return lheight>rheight? lheight+1:rheight+1;//树的高度为左右子树的最大者
	}
}

//求特定节点的父节点
BiTree PreOrderTraverse(BiTree Root,char target,BiTree parent){
	if(Root!=NULL){
		if(Root->data==target)
			return parent;
		BiTree lparent=PreOrderTraverse(Root->lchild,target,Root);//先序遍历左子树
		if(lparent)
			return lparent;
		BiTree rparent=PreOrderTraverse(Root->rchild,target,Root);//先序遍历右子树
		if(rparent)
			return rparent;
	}
	return NULL;//若返回Null,则代表该子树不存在目标字符
}
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值