C语言数据结构,二叉树的基本操作。

  • 设计思路:先初始化一棵树,让根节点为空,这样可在建立二叉树或进行其他基本操作时,判断为空可判断根节点是否为空便好。创建一个二叉树时,可利用一个特殊值为关键点,确定是否继续往下操作,若继续往下操作,看是往左孩子还是又孩子操作,若往又孩子进行操作,可让又孩子递归,相反让左孩子递归。进行其他二叉树的基本操作时,一般都用递归的思想,代码简洁,方便操作。
  • #include<stdio.h>
    #define ok 1
    #define error 0
    #define NULL 0
    
    typedef int type_data;
    typedef struct node {
    	type_data data;
    	struct node* left, * right;
    }node;
    //初始化一棵树
    node* creat(node* tree) {
    	//node *tree=new node;
    	tree = NULL;
    	return tree;
    
    }
    /* 按先序次序建立一个二叉树*/
    node* BinTreeCreat(node *tree)
    {
    	//node *tree;
    	int e;
    	printf("请输入值,按0停止输入:");
    	scanf_s("%d", &e);
    	//return tree;
    	if(e==0)
    	{
    		tree =NULL;
    		//tree->left = NULL;
    		//tree->right = NULL;
    		return tree;
    	}
    	else {
    		tree = new node;
    		tree->data = e;
    		//tree->left = NULL;
    		//tree->right = NULL;
    		BinTreeCreat(tree->left);
    		BinTreeCreat(tree->right);
    		
    
    	}
    	return tree;
    	
    }
    
    /*node* BinTreeCreat(node* tree)
    {
    	node* w = new node;
    	tree= w;
    	int e;
    	printf("请输入值,按0停止输入:");
    	scanf_s("%d", &e);
    	if (e == 0)
    	{
    		w= NULL;//不能让tree=NULL;因为要让《每次》改变后的值为空!
    		return w;
    	}
    	if (w != NULL)
    	{
    		w->data = e;
    		//w->left = NULL;
    		//w->right = NULL;
    		w->left=BinTreeCreat(w->left);
    		w->right=BinTreeCreat(w->right);
    	}
    
    	return tree;
    
    }*/
    
    /* 检查二叉树是否为空 */
    type_data BinTreeEmpty(node* tree)
    {
    	if (tree == NULL)
    	{
    		printf("该二叉树为空!");
    		return ok;
    	}
    	else
    	{
    		printf("该二叉树不为空!");
    		return error;
    	}
    }
    
    /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
    /*type_data BinTraverse(node* tree,int x)
    {
    	
    	if (!tree)
    	{
    		printf("该二叉树为空!");
    		return error;
    	}
    	if (x == 1)
    	{
    		if (tree->data > -9999&& tree->data < 9999) {
    			printf("该二叉树的先序遍历为:");
    			printf("%2d", tree->data);
    			BinTraverse(tree->left, x);
    			BinTraverse(tree->right, x);
    		}
    	}
    	else if (x == 2)
    	{
    		printf("该二叉树的中序遍历为:");
    		if (tree->data > -9999 && tree->data < 9999) {
    			BinTraverse(tree->left, x);
    			printf("%2d", tree->data);
    			BinTraverse(tree->right, x);
    		}
    	}
    	else if (x== 3)
    	{
    		if (tree->data > -9999 && tree->data < 9999) {
    			printf("该二叉树的后序遍历为:");
    			BinTraverse(tree->left, x);
    			BinTraverse(tree->right, x);
    			printf("%2d", tree->data);
    		}
    	}
    	else
    	{
    		printf("你输入的选项错误!请继续输入:\n");
    		scanf_s("%d", &x);
    
    	}
    	return ok;
    
    
    }*/
    //遍历二叉树
    type_data BinTraverse(node* tree,int x)
    {
    
    	if (tree==NULL)
    	{
    		//printf("该二叉树为空!");
    		return NULL;
    	}
    	if (x == 1)
    	{
    		//if (tree->data > -9999&& tree->data < 9999) {
    		//printf("该二叉树的先序遍历为:");
    		printf("%2d", tree->data);
    		BinTraverse(tree->left, x);
    		BinTraverse(tree->right, x);
    		//}
    	}
    	else if (x == 2)
    	{
    		//printf("该二叉树的中序遍历为:");
    		//if (tree->data > -9999 && tree->data < 9999) {
    		BinTraverse(tree->left, x);
    		printf("%2d", tree->data);
    		BinTraverse(tree->right, x);
    		//}
    	}
    	else if (x== 3)
    	{
    		//if (tree->data > -9999 && tree->data < 9999) {
    		//printf("该二叉树的后序遍历为:");
    		BinTraverse(tree->left, x);
    		BinTraverse(tree->right, x);
    		printf("%2d", tree->data);
    		//}
    	}
    	else
    	{
    		printf("你输入的选项错误!请继续输入:\n");
    		scanf_s("%d", &x);
    
    	}
    	return ok;
    
    
    }
    
    /* 求二叉树的深度 */
    type_data BinTreeDepth(node* tree)
    {
    	if (tree== NULL)
    	{
    		//printf("该二叉树为空!");
    		return 0;
    	}
    	else
    	{
    		int hl=0, hr=0;
    		//tree = tree->left;
    		hl = BinTreeDepth(tree->left);
    		//tree = tree->right;
    		hr = BinTreeDepth(tree->right);
    		if (hl > hr) {
    			return hl+1;
    			//printf("该二叉树的深度为:%d", hl + 1);
    		}
    		else
    		{
    			return hr+1;
    			//printf("该二叉树的深度为:%d", hr + 1);
    		}
    	}
    	//return ok;
    }
    /* 求二叉树中所有结点数 */
    type_data BinTreeCount(node* tree)
    {
    	//int count = 0;
    	if (tree == NULL)
    	{
    
    		//printf("该二叉树为空!");
    		return 0;
    
    	}
    	else
    	{
    
    		return BinTreeCount(tree->left) + BinTreeCount(tree->right)+1;
    		//return ;
    	}
    
    }
    /* 清除二叉树,使之变为空树 */
    void BinTreeClear(node* tree)
    {
    	tree = NULL;
    	printf("该二叉树已销毁!");
    }
    void main()
    {
    	node *tree = new node;
    	printf("1-初始化二叉树:\n");
    	printf("2-检查二叉树栈是否为空\n");
    	printf("3-清除二叉树\n");
    	printf("4-遍历二叉树\n");
    	printf("5-计算二叉树的深度\n");
    	printf("6-计算二叉树的所有节点\n");
    	printf("7-创建二叉树!\n");
    	int y, r = 0, l = 0,x;
    	//做一个do……while循环,确保在swtich……case语句里,每一项功能执行后都能继续执行总程序
    	do {
    		printf("请你选择功能!\n");
    		int week;
    		scanf_s("%d", &week);
    		switch (week)
    		{
    		case 1:
    			tree=creat(tree);
    			printf("初始化成功!\n");
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			//用if语句判断,是否继续功能,下同
    			if (y == 1)
    			{
    
    				continue;
    			}
    			else
    				break;
    		case 2:
    			BinTreeEmpty(tree);
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    		case 3:
    			BinTreeClear(tree);
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    
    		case 4:
    			//int r;
    
    			printf("请输入你要选择的遍历方法1or2or3:");
    			scanf_s("%d", &x);
    			BinTraverse(tree,x);
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    		case 5:
    			BinTreeDepth(tree);
    			printf("该二叉树的高度为:%d\n", BinTreeDepth(tree));
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    
    
    		case 6:
    			BinTreeCount(tree);
    			//get_top(s,l);
    			printf("你的二叉树的结点数量为:%d\n", BinTreeCount(tree));
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    		case 7:
    			tree=BinTreeCreat(tree);
    			//get_top(s,l);
    			//printf("你获得的栈顶元素为:%d\n", get_top(s, l));
    			printf("请选择是否执行功能:1or0\n");
    			scanf_s("%d", &y);
    			if (y == 1)
    			{
    				continue;
    			}
    			else
    				break;
    		}
    
    	} while (y == 1);
    }

     


版权声明:本文为weixin_47303191原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。