二叉树 遍历|统计叶子节点|求深度|交换左右子树|查找是否存在某个特定叶子节点练习题

本文详细介绍了C++中二叉树数据结构的基本概念、创建、初始化、构建、遍历(前序、中序、后序)、统计叶子节点数量、计算树的深度、查找特定元素以及交换叶子节点的左右子树等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4、二叉树:

#include <stdio.h>
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define MaxSize 100

struct TNode{
	int data;
	struct TNode *lchild;
	struct TNode *rchild;
};

/*

  BiTree* createBiTree ()
{	DataType ch;
    BiTree * T;
    ch=getchar();
    if(ch=='#') return NULL;
    else
	{	T=(BiTree *)malloc(sizeof(BiTree));
        T->data=ch;
        T->lchild=createBiTree();
        T->rchild=createBiTree();
        return T;
    }
}

*/

typedef struct TNode Node;
//初始化
void init(Node **node)
{
	*node = (Node *)malloc(sizeof(Node));
	(*node)->lchild = NULL;
	(*node)->rchild = NULL;
	(*node)->data = 0;
}
//构建
void construct(char data,Node **node)
{

	Node *temp_node = *node;
	while(temp_node)
	{
		if(!temp_node->data)
		{
			temp_node->data = data;
			break;
		}
		else if(data<= temp_node->data)
		{
			if(!temp_node->lchild)
			{
				init(&temp_node->lchild);
				temp_node->lchild->data = data;
				break;
			}
			else
			{
				temp_node = temp_node->lchild;
				continue;
			}
		}
		else if(data>temp_node->data)
		{
			if(!temp_node->rchild)
			{
				init(&temp_node->rchild);
				temp_node->rchild->data = data;
				break;
			}
			else
			{
				temp_node = temp_node->rchild;
				continue;
			}
		}
		else if(temp_node->data)
		break;
	}
	return;
}



void xianxu(Node *tree_node) //根左右
{

   if(tree_node){

	printf("%d ",tree_node->data);
	xianxu(tree_node->lchild);
	xianxu(tree_node->rchild);

    }
}

void zhongxu(Node *tree_node) //左根右
{

   if(tree_node){


	xianxu(tree_node->lchild);
		printf("%d ",tree_node->data);
	xianxu(tree_node->rchild);

    }
}


void houxu(Node *tree_node) //左右根
{

   if(tree_node){


	xianxu(tree_node->lchild);
	xianxu(tree_node->rchild);
	printf("%d ",tree_node->data);

    }
}

//统计总共有多少个叶子节点
int leafnum(Node *tree_node)
{
	  if(tree_node){
	if(tree_node->lchild==NULL&&tree_node->rchild==NULL)
		return 1;
	else
	{

		return leafnum(tree_node->lchild)+leafnum(tree_node->rchild);


	}
	  }else
		  return 0;


}
//求树的深度
int deepfunc(Node *tree_node)
{
	int lnum;
	int rnum;
	  if(!tree_node)
		  return 0;
	if(tree_node->lchild==NULL&&tree_node->rchild==NULL)
		return 1;
	else
	{
	lnum=deepfunc(tree_node->lchild);
	rnum=deepfunc(tree_node->rchild);
	return lnum>=rnum?(lnum+1):(rnum+1);


	}
	  

}
//在一个树上查找是否存在某个特定的叶子结点 0未找到,1找到:
int findTree(Node *tree_node,int num)
{
	if(!tree_node)
		return 0;
	if(tree_node->data==num)
		return 1;
	else if(findTree(tree_node->lchild,num))
	{
		return 1;
	
	}else 

		return findTree(tree_node->rchild,num);
	

}
//交换每个叶子结点的左右子树
void trans(Node *tree_node,Node *pnode)
{
	if(!tree_node)
		return;

	pnode=tree_node->lchild;
	tree_node->lchild=tree_node->rchild;
	tree_node->rchild=pnode;
	trans(tree_node->lchild,pnode);
	trans(tree_node->rchild,pnode);


}
void main()
{
	int i;
	int num=0;
	int n;
	Node *root;
	Node *pnode;
	int data[7] = {45,24,53,45,12,24,90};

	init(&root);
	for(i=0;i<7;i++)
		construct(data[i],&root);
	printf("\nxianxu:\n");
	xianxu(root);
	printf("\nzhongxu:\n");
	zhongxu(root);
	printf("\nhouxu:\n");
	houxu(root);
	printf("\n叶子节点的个数:\n");
	
	num=leafnum(root);
	printf("%d\n",num);
	printf("\n树的深度:\n");
	printf("%d\n",deepfunc(root));
	printf("\n是否找到某个特定的元素:\n");
	scanf("%d",&n);
	if(findTree(root,n)==1)
		printf("\YES\n");
	else
		printf("\NO\n");
	printf("交换每个结点的左右子树:\n");
	trans(root,pnode);
		xianxu(root);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值