数据结构,二叉树的遍历

首先是对于二叉树的创建

typedef struct BTreeNode
{
    TelernType data;      //树的数据域为字符型
    struct BTreeNode* LChild;         //*左孩子指针
    struct BTreeNode* RChild;         //*右孩子指针
}BTree;



BTree* CreatBTree() //创建二叉树
{
    BTree* T; 
    char x;
    //printf("创建二叉树请输入根节点:");
    scanf("%c", &x); //字符串接收
    getchar();
    if (x == '0') //当左右子树不存在时用0代替
        T = NULL;
    else
    {
        T = (BTree*)malloc(sizeof(BTree));  //开辟一个动态空间强制转换成BTree类型
        T->data = x;
        printf(" 请输入 %c 结点的左孩子:", T->data);
        T->LChild = CreatBTree();
        printf(" 请输入 %c 结点的右孩子:", T->data);
        T->RChild = CreatBTree();
    }
    return T;
}

前序遍历二叉树

void PreOrder(BTree* T)
{
	if (T == NULL)
	{
		return;
	}
	printf("%c ", T->data);
	PreOrder(T->LChild);
	PreOrder(T->RChild);

}

求二叉树的高度(递归):

int getDept(BTree*T)
{
	int LD, RD;
	if (T == NULL)
		return 0;
	else
	{
		LD = getDept(T->LChild);
		RD = getDept(T->RChild);
		return (RD > LD ? RD : LD) + 1;
	}
}

也可以采用迭代的方式求二叉树的高度:(二选一)

int getDept(BTree* T) {
	if (T == NULL) { //如果为空则返回0
		return 0;
	}
	int height = 0;       //计算树的高度,遍历完一层+1
	BTree* queue[100];    // 初始化队列,队列空间足够大
	int front = 0, rear = 0; //
	queue[rear++] = T;
	while (front < rear) { //初始条件非空
		int size = rear - front;    // 当前层节点数
		while (size--) {
			BTree* T = queue[front++];
			if (T->LChild) {
				queue[rear++] = T->LChild;    // 将左子节点加入队列中
			}
			if (T->RChild) {
				queue[rear++] =T->RChild;   // 将右子节点加入队列中
			}
		}
		height++;    // 每遍历完一层,树高度加1
	}
	return height;
}

计算叶子节点的个数

int count = 0;
void leafnum(BTree* T)
{
	if (T)        //树不空
	{
		if (T->LChild == NULL && T->RChild == NULL)
			count++;
		leafnum(T->LChild);
		leafnum(T->RChild);
	}
}

主函数:用于选择二叉树操作:

void main()
{
	BTree* T = NULL;
	int k;

	do
	{
		printf("\n\n\n\n");
		printf("\t\t\t  树 子系统\n");
		printf("\t\t******************************\n");
		printf("\t\t*        1----建二叉树    *\n");
		printf("\t\t*        2----前序遍历    *\n");
		printf("\t\t*        3----中序遍历    *\n");
		printf("\t\t*        4----后序遍历    *\n");
		printf("\t\t*        5----求树高度      *\n");
		printf("\t\t*        6----叶子个数     *\n");
		printf("\t\t*        0----返  回    *\n");
		printf("\t\t******************************\n");
		printf("\t\t 请选择菜单项(0-5):");
		scanf("%d", &k); getchar();
		if (k == 1)
		{
			//建立二叉树
			printf("\n 请输入此树的根结点:");
			T =CreatBTree();				
		}
		else if (k == 2)
		{
			printf("\n   此树前序遍历的顺序:");
			PreOrder(T);
	
		}
		else if (k == 3)
		{
			printf("\n   此树中序遍历的顺序:");
			InOrder(T);
			
		}
		else if (k == 4)       //查找线性表中元素值为x的位置
		{
			printf("\n   此树后序遍历的顺序:");
			postOrder(T);

		}
		else if (k == 5)        //求树的高度
		{
			int h;
			h = getDept(T);
			printf("\n此树的高度是:%d",h);
		}
		else if (k == 6)        //输出链表
		{
			leafnum(T);
			printf("\n此树叶子结点个数是:%d",count);
		}
	} while (k != 0);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值