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

二叉树的相关操作代码(继续补全中)
#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