基于二叉链表存储的二叉树的操作实现(C++)

1、二叉树的二叉链表表示、创建、遍历(3种方法)、求深度基本操作实现。

(1)创建二叉树(CreateBiTree):

根据先序遍历序列递归创建二叉树。遇到字符 '#' 时创建空节点,否则创建新节点,并递归创建其左子树和右子树。

(2)先序遍历(Preorder):

递归访问根节点,然后先序遍历左子树,最后先序遍历右子树。

(3)中序遍历(Inorder):

递归中序遍历左子树,访问根节点,然后中序遍历右子树。

(4)后序遍历(Postorder):

递归后序遍历左子树,后序遍历右子树,最后访问根节点。

(5)求二叉树深度(BiTreeDepth):

递归计算左子树和右子树的深度,取较大值加1作为当前节点的深度。若树为空,深度为0。

#include
using namespace std;

void visit(BiTree T)
{
	cout<data;
}

int strlength(char S[])
{
	int i=0;
    while(S[i]!='\0')
	i++;
	return i;	
} 

//先序遍历以T为根指针的二叉树 
void Preorder(BiTree T)
{
	if(T)
	{
		cout<data;
		Preorder(T->lchild);
		Preorder(T->rchild);
	} 
}

//中序遍历以T为根指针的二叉树
void Inorder(BiTree T)
{
	if(T)
	{
		Inorder(T->lchild);
		cout<data;
		Inorder(T->rchild);
	}
}

//后序遍历以T为根指针的二叉树
void Postorder(BiTree T)
{
	if(T)
	{
		Postorder(T->lchild);
		Postorder(T->rchild);
		cout<data;
	}
}
 
//char exp[]="ABD##EG##H##C#FI#J###";
char exp[]="AB#DE###C##";
int i;
//在先序遍历二叉树过程中输入结点字符,建立二叉链表存储结构 
//指针T指向所建二叉树的根结点 
bool CreateBiTree(BiTree &T)
{
	TElemType ch;
    ch=exp[i];
    if(ch=='#') T=NULL; 
	else
	{
		T=new BiTNode;
		T->data=ch;
		i++;
		CreateBiTree(T->lchild); //递归遍历左子树 
		i++;
		CreateBiTree(T->rchild);//递归遍历右子树 
	} 	
	return TRUE;
}//CreateBiTree


//后序遍历求T所指二叉树的深度 
int BiTreeDepth(BiTree T){
	int hL,hR;
	if(!T) return 0;
	else{
		hL=BiTreeDepth(T->lchild);
		hR=BiTreeDepth(T->rchild);
		if(hL>=hR) return hL+1;
		else return hR+1;
	} 
}//BiTreeDepth

//计算所有结点的数目 
int nodenum(BiTree T) 
{
    if (!T)
        return 0;
    return 1 + nodenum(T->lchild) + nodenum(T->rchild);
}

//计算所有叶子结点的数目 
int leafnum(BiTree T) 
{
    if (!T)
        return 0;
    else if(!(T->lchild||T->rchild)) return 1;
//    else if(!T->lchild && !T->rchild) return 1;
    else
    return leafnum(T->lchild) + leafnum(T->rchild);
}


int main()
{
	BiTree T;
	CreateBiTree(T);
	cout<<"先序遍历(递归)";
	Preorder(T);
    cout<

结果如下

基于二叉链表存储的二叉树的操作实现(C++)_第1张图片

你可能感兴趣的:(基于二叉链表存储的二叉树的操作实现(C++))