二叉树的创建、先序、中序、后序遍历、层次遍历、树的高度、结点数、叶子结点数、左右结点交换

#二叉树的创建、先序、中序、后序遍历、层次遍历、树的高度、结点数、叶子结点数、左右结点交换
下面展示一些 内联代码片

#include <stdio.h>
#include <iostream>
#include <malloc.h>
#include <string.h>
using namespace std;
//定义二叉树结构
typedef struct Node
{
    char data;
    struct Node *lchild,*rchild;//创建左右结点指针
}*BTree,BTNode;
//程序使用的函数
void CreateBTree(BTree &T);//按先序遍历方式创建二叉树
void PreOrderTraverse(BTree T);//先序遍历函数
void InOrderTraverse(BTree T);//中序遍历函数
void PostOrderTraverse(BTree T);//后序遍历函数
void LevelTraverse(BTree T) ;//层次遍历函数
int SearchDepth(BTree T);//求树的高度度函数
int NodeNum(BTree T);//求二叉树中结点个数函数
int LeafNum(BTree T);//求二叉树中叶子结点个数函数
void ExChangeTree(BTree &T);//左右结点交换函数

//按先序遍历方式创建二叉树
void CreateBTree(BTree &T)
{
    char ch;
    cin>>ch;//将输入的字符储存在数组ch中
    if(ch=='*')//定义符号*为空树
		T=NULL;
    else  //输入字符不为*,将其储存在树中
	{
        T=new BTNode;
        T->data=ch;
        CreateBTree(T->lchild);
        CreateBTree(T->rchild);
    }
}
//先序遍历函数
void PreOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        cout<<T->data;
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
//中序遍历函数
void InOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        InOrderTraverse(T->lchild);
        cout<<T->data;
        InOrderTraverse(T->rchild);
    }

}

//后序遍历函数
void PostOrderTraverse(BTree T)
{
    if(T!=NULL)//当结点不为空时,遍历二叉树
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout<<T->data;
    }

}


//层次遍历函数
void LevelTraverse(BTree T)            
{
    if(T==NULL) 
	{
		printf("二叉树为空树");
		return;
	}
    BTNode *queue[50];            //创建应该队列
    int front=0;
    int rear=0;
    BTNode *p;        
    queue[rear]=T;//树根入队
    while(front!=rear)//当前端和后端不相等时
    {     
        p=queue[front];//p指向根,读出根,并出队
        printf("%c",p->data);//输出二叉树的结点
        if(p->lchild!=NULL)     //左子树不为空,入队
        {
            queue[rear]=p->lchild;
        }
        if(p->rchild!=NULL)   //右子树不为空,入队
        {
            queue[rear]=p->rchild;
        }
    }
}


//求树的高度度函数
int SearchDepth(BTree T)
{
    if(T==NULL)
	{
		return 0;
	}
    else
    {
        int m=SearchDepth(T->lchild);
        int n=SearchDepth(T->rchild);
        if(m>n) 
		{
			return (m+1);
		}
        else 
		{
			return (n+1);
		}
    }
}
//求二叉树中结点个数函数
int NodeNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    else //第一个结点不为空,结点数为左右子树数加上第一个结点
	{
		return NodeNum(T->lchild)+NodeNum(T->rchild)+1;
	}
}
//求二叉树中叶子结点个数函数
int LeafNum(BTree T)
{
    if(T==NULL) //如果第一个为空节点,则二叉树为空,返回值为0
	{
		return 0;
	}
    if(T->lchild==NULL &&T->rchild==NULL)//如果二叉树左右子树皆为空,说明该二叉树只有根节点为叶子节点,返回值1.
	{
        return 1;
    }
	else   //否则叶子结点数为左右子树之和
	{
        return LeafNum(T->lchild)+LeafNum(T->rchild);
    }
}

//左右结点交换函数
void ExChangeTree(BTree &T)
{
    BTree tem;
    if(T!=NULL)//判断T是否为空,非空进行转换,否则不转换
	{
        tem=T->lchild;
        T->lchild=T->rchild;//直接交换节点地址
        T->rchild=tem;
        ExChangeTree(T->lchild);
        ExChangeTree(T->rchild);
    }
}

int main()//主函数调用前面子函数并输出结果
{
    BTree T;
    cout<<"按先序遍历方式创建二叉树(用*表示空树):";
    CreateBTree(T);
    cout<<"中序遍历输出结果:";
    InOrderTraverse(T);
    cout<<endl<<"先序遍历输出结果:";
    PreOrderTraverse(T);
    cout<<endl<<"后序遍历输出结果:";
    PostOrderTraverse(T);
	cout<<endl<<"层次遍历输出结果:";
	LevelTraverse(T);
    cout<<endl<<"树的高度:"<<SearchDepth(T);
    cout<<endl<<"总结点的个数:"<<NodeNum(T);
    cout<<endl<<"叶结点的个数:"<<LeafNum(T);
    BTree temporarytree=T;  //复制一颗树,在不改变原树的情况下,对临时树进行交换。
    ExChangeTree(temporarytree);
    cout<<endl<<"左右结点交换结果:";
	PreOrderTraverse(temporarytree);
	printf("\n");
    return 0;
}

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值