- 设计思路:先初始化一棵树,让根节点为空,这样可在建立二叉树或进行其他基本操作时,判断为空可判断根节点是否为空便好。创建一个二叉树时,可利用一个特殊值为关键点,确定是否继续往下操作,若继续往下操作,看是往左孩子还是又孩子操作,若往又孩子进行操作,可让又孩子递归,相反让左孩子递归。进行其他二叉树的基本操作时,一般都用递归的思想,代码简洁,方便操作。
#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版权协议,转载请附上原文出处链接和本声明。