二叉树的应用

二叉树的应用

#include<stdio.h>
#include"malloc.h"
#define N 1000
typedef char DataType;

typedef struct bnode{
	DataType data;
	struct bnode * lchild, *rchild;
} Bnode,*BTree;

/*******二叉树的创建*********/
//算法6.11 创建二叉链表存储的二叉树
/*按照二叉树的遍历的思想即可*/
BTree   CreateBinTree()
{
	/* 以加入空结点的先序序列输入,构造二叉链表 */
	char ch;  
	BTree  t;
	ch = getchar(); //不断的从控制台获取数据 作为结点的数据域
	if (ch == '#')  t = NULL;   /*读入#时,将相应结点指针置空*/
	else
	{
		t = (BTree)malloc(sizeof(Bnode));  /* 生成结点空间 */
		t->data = ch;
		t->lchild = CreateBinTree();     /*构造二叉树的左子树 */
		t->rchild = CreateBinTree();     /*构造二叉树的右子树 */
	}
	return t;
}

//访问结点
void Visit(DataType data)
{
	printf("%-3c", data);
}

//先序递归遍历
void PreOrder (BTree t){
	if(t){
		Visit(t->data);
		PreOrder (t->lchild);
		PreOrder (t->rchild);
	}
}

/*******************************叶子结点************************************/
//1.统计二叉树的叶子结点的数量
/*  叶子结点:没有左子树也没有右子树的结点
1.先设置一个计数器,记录叶子结点的数量m
2.遍历过程中,判断是否为叶子结点
  是: m+1; 
3.直到遍历结束,就可以得到叶子结点的数量了
<这里用先序遍历方法递归实现>
*/
void numfleaf(BTree t , int &m)
{/*这里的m是引用型形参,每一次递归调用前都可以实时记录叶子结点的个数*/
	if(t){
		if(t->lchild==NULL && t->rchild==NULL){/*左右子树为空*/
			m++;  /*叶子结点计数器加1*/
		}
		numfleaf(t->lchild,m); 
		numfleaf(t->rchild,m);//递归遍历左右子树
	}
}

/*******************************叶子结点************************************/


//算法实现左右孩子交换
void Exchange(BTree t)//算法实现左右孩子交换
{
	BTree p;
	if(t)
	{
		p=t->lchild;
		t->lchild=t->rchild;
		t->rchild=p;
		Exchange(t->lchild);
		Exchange(t->rchild);
	}
}

// 递归在二叉树中求位于先序序列中第k位置的结点值
int c;  //计数器c作为全局变量处理,初始值为0
void Get_PreSeq(BTree T, int k) //线序序列为k的结点的值
{
	if(T)
	{
		c++; //每访问一个子树的根都会使线序序号计数器加1
		if(c==k)
		{
			printf("\n指定结点的值是%d\n",T->data);
			//exit(1);
		}
		else
		{
			Get_PreSeq(T->lchild,k); //在左子树中查找
			Get_PreSeq(T->rchild,k); //在右子树中查找
		}
	}
}

//主调函数示例:
int main()
{
	//输入示例:ABC#DEF####G###  ;
	BTree t;
	int m;
	int k;
	t=CreateBinTree();//先建立二叉树;
	m=0; //全局变量m置初始值
	numfleaf(t ,m);//求t树叶子结点的个数
	printf("\n叶子结点的个数:m = %d\n",m);  //输出结果

	k = 2;  //先默认一个值,可以换换试试
	Get_PreSeq(t,k); //线序序列为k的结点的值
	/*函数里有输出语句,所以这里不printf()了*/

	Exchange(t);//算法实现左右孩子交换
	printf("\n交换左右孩子后层次遍历二叉树:\n");
	PreOrder(t);
	printf("\n");
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个二叉树应用实例代码的C语言实现,用于创建一棵二叉树并进行先序、中序和后序遍历: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int data; // 节点数据 struct TreeNode *left; // 左子 struct TreeNode *right; // 右子 } TreeNode; // 创建一棵二叉树 TreeNode *createBinaryTree() { TreeNode *root = NULL; int data; printf("请输入节点数据:"); scanf("%d", &data); if (data != -1) { // -1代表空节点 root = (TreeNode *)malloc(sizeof(TreeNode)); root->data = data; root->left = createBinaryTree(); root->right = createBinaryTree(); } return root; } // 先序遍历二叉树 void preOrder(TreeNode *root) { if (root) { printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } } // 中序遍历二叉树 void inOrder(TreeNode *root) { if (root) { inOrder(root->left); printf("%d ", root->data); inOrder(root->right); } } // 后序遍历二叉树 void postOrder(TreeNode *root) { if (root) { postOrder(root->left); postOrder(root->right); printf("%d ", root->data); } } int main() { TreeNode *root = createBinaryTree(); printf("先序遍历结果:"); preOrder(root); printf("\n中序遍历结果:"); inOrder(root); printf("\n后序遍历结果:"); postOrder(root); printf("\n"); return 0; } ``` 在运行程序时,先输入每个节点的数据,以-1表示空节点。例如,输入以下数据表示创建一棵二叉树: ``` 请输入节点数据:1 请输入节点数据:2 请输入节点数据: -1 请输入节点数据: -1 请输入节点数据: 3 请输入节点数据: -1 请输入节点数据: -1 ``` 程序会输出先序、中序和后序遍历的结果: ``` 先序遍历结果:1 2 3 中序遍历结果:2 1 3 后序遍历结果:2 3 1 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值