递归建立和遍历二叉树等

来源:互联网 发布:淘宝客成功的原因 编辑:程序博客网 时间:2024/05/17 09:37
// Recursion.cpp : 定义控制台应用程序的入口点。 技术交流,请上<a target=_blank href="http://wenwen.website/">问问分享平台</a>。
//#include "stdafx.h"#include <malloc.h>typedef int ElemType;typedef struct BT{ElemType data;struct BT *lch, *rch;} BT;BT *CreateBT();void PreorderTraversal(BT *T);void InTraversal(BT *T);void Postorder(BT *T);void GetLeafNum(BT *T);void ShowTree(BT *T);void GetNodeNum(BT *T);int _tmain(int argc, _TCHAR* argv[]){BT *T = NULL;int choice;do{printf("\n");printf(" 二叉树 \n");printf(" *****************************");printf(" * *\n");printf(" * 主菜单 *\n");printf(" * 1 建立二叉树 *\n");printf(" * 2 先序遍历二叉树 *\n");printf(" * 3 中序遍历二叉树 *\n");printf(" * 4 后序遍历二叉树 *\n");printf(" * 5 二叉树叶子节点数目 *\n");printf(" * 6 显示二叉树 *\n");printf(" * 7 二叉树所有节点数 *\n");printf(" * 8 退出程序 *\n");printf("*****************************");printf(" 请您选择操作(1,2......8)");scanf_s("%d", &choice);if (choice == 1){printf("二叉树建立,以输入0表示结束:!\n");printf("请输入跟节点:\n");T = CreateBT();printf("二叉树建立成功");}else if (choice == 2){printf("先序遍历二叉树:\n");PreorderTraversal(T);}else if (choice == 3){printf("中序遍历二叉树:\n");InTraversal(T);}else if (choice == 4){printf("后续遍历二叉树:\n");Postorder(T);}else if (choice == 5){printf("二叉树叶子节点数目:\n");GetLeafNum(T);}else if (choice == 6){printf("查看二叉树:\n");ShowTree(T);}else if (choice == 7){int count = 0;GetNodeNum(T);printf("该二叉树共有%d个节点", count);}else {}} while (choice <= 8);getchar();return 0;}// 建立二叉树BT *CreateBT(){BT *t;int x;scanf_s("%d", &x);if (x == 0){t = NULL;}else{t = (BT*)malloc(sizeof(BT));t->data = x;printf("\n请输入%d节点的左子节点", t->data);t->lch = CreateBT();printf("\n请输入%d节点的右子节点", t->data);t->rch = CreateBT();}return t;}// 前序遍历void PreorderTraversal(BT *T){if (T == NULL){return;}else{printf("%3d", T->data);PreorderTraversal(T->lch);PreorderTraversal(T->rch);}}// 中序遍历void InTraversal(BT *T){if (T == NULL){return;}else{InTraversal(T->lch);printf("%3d", T->data);InTraversal(T->rch);}}// 后序遍历void Postorder(BT *T){if (T == NULL){return;}else{Postorder(T->lch);Postorder(T->rch);printf("%3d", T->data);}}// 获取叶子数void GetLeafNum(BT *T){int count = 0;if (T){if (T->lch == NULL&&T->rch == NULL)count++;GetLeafNum(T->lch);GetLeafNum(T->rch);}printf("%d", count);}// 显示二叉树void ShowTree(BT *T){BT *stack[100];BT*p;int level[100][2];int top, n, i;int width = 4;if (T != NULL){printf("\n二叉树的表示法f:\n");top = 1;stack[top] = T;level[top][0] = width;while (top > 0){p = stack[top];n = level[top][0];for (i = 1; i <= n; i++)printf(" ");printf("%d", p->data);for (i = n + 1; i < 60; i += 2)printf("*");printf("\n\t\t");top--;if (p->rch != NULL){top++;stack[top] = p->rch;level[top][0] = n + width;level[top][1] = 2;}if (p->lch != NULL){top++;stack[top] = p->lch;level[top][0] = n + width;level[top][1] = 1;}}}}// 计算节点数void GetNodeNum(BT *T){int count = 0;if (T) count++;GetNodeNum(T->lch);GetNodeNum(T->rch);printf("%d", count);}

0 0
原创粉丝点击