版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<iostream>using namespace std;#define MAXLEN 20 /最大长度int num;typedef char DATA;/定义元素类型struct CBTType/ 定义二叉树结点类型DATA data;/元素数据 CBTType * left;/左子树结点指针 CBTType * right;/右子树结点指针 int leftSize = 0;/*初始化二叉树*/CBTType *InitTree()CBTType * node;if (node = new CBTType)/申请内存 num+;cout << &
2、quot;请先输入一个根节点数据:" << endl;cin >> node->data;node->left = NULL;node->right = NULL;if (node != NULL)/如果二叉树结点不为空 return node;elsereturn NULL;return NULL;/*查找结点*/CBTType *TreeFindNode(CBTType *treeNode, DATA data)CBTType *ptr;if (treeNode = NULL)return NULL;elseif (treeNode-&g
3、t;data = data)return treeNode;else/分别向左右子树查找 if (ptr = TreeFindNode(treeNode->left, data)/左子树递归查找 return ptr;else if (ptr = TreeFindNode(treeNode->right, data)/右子树递归查找 return ptr;elsereturn NULL;/*添加结点*/void AddTreeNode(CBTType *treeNode)CBTType *pnode, *parent;DATA data;char menusel;if (pnode
4、 = new CBTType) /分配内存 cout << "输入添加的二叉树结点数据:" << endl;cin >> pnode->data;pnode->left = NULL; /设置左子树为空 pnode->right = NULL; /设置左子树为空 cout << "输入该结点的父结点数据:" << endl;cin >> data;parent = TreeFindNode(treeNode, data); /查找父结点,获得结点指针 if (!pa
5、rent) /没找到cout << "没有找到父结点!" << endl;delete pnode;return;cout << "*" << endl;cout << "*请输入相应数字: *" << endl;cout << "*1.添加该结点到左子树*" << endl;cout << "*2.添加该结点到右子树*" << endl;cout << "
6、;*" << endl;docin >> menusel;if (menusel = '1' | menusel = '2')switch (menusel)case '1': /添加结点到左子树 if (parent->left) /左子树不为空cout << "左子树结点不为空" << endl;elseparent->left = pnode;parent->leftSize+;num+;cout << "数据添加成功!&q
7、uot; << endl;break;case '2': /添加结点到右子树 if (parent->right) /右子树不为空cout << "右子树结点不为空" << endl;elseparent->right = pnode;num+;cout << "数据添加成功!" << endl;break;default:cout << "子节点选择错误!" << endl;break; while (menusel !=
8、 '1'&&menusel != '2');/*计算二叉树的深度*/int TreeDepth(CBTType *treeNode)int depleft, depright;if (treeNode = NULL)return 0; /结点为空的时候,深度为0 elsedepleft = TreeDepth(treeNode->left); /左子树深度(递归调用)depright = TreeDepth(treeNode->right); /右子树深度(递归调用)if (depleft)return +depleft;elsere
9、turn +depright;/*显示结点数据*/void ShowNodeData(CBTType *treeNode)cout << treeNode->data << " " /*清空二叉树*/void ClearTree(CBTType *treeNode)if (treeNode)/判断当前树不为空 ClearTree(treeNode->left); /清空左子树ClearTree(treeNode->right); /清空右子树delete treeNode; /释放当前结点所占用的内存 /*按层遍历算法*/void
10、LevelTree(CBTType *treeNode)CBTType *p;CBTType *qMAXLEN; /定义一个队列 int head = 0, tail = 0;if (treeNode) /如果队首指针不为空tail = (tail + 1) % MAXLEN; /计算循环队列队尾序号qtail = treeNode; /二叉树根指针进入队列 while (head != tail)head = (head + 1) % MAXLEN; /计算循环队列的队首序号p = qhead; /获取队首元素ShowNodeData(p); /输出队首元素if (p->left !=
11、 NULL) /如果存在左子树tail = (tail + 1) % MAXLEN; /计算队列的队尾序号qtail = p->left; /左子树入队 if (p->right != NULL) /如果存在右子树tail = (tail + 1) % MAXLEN; /计算队列的队尾序号qtail = p->right; /右子树入队 /*先序遍历算法*/void DLRTree(CBTType *treeNode)if (treeNode)ShowNodeData(treeNode); /显示结点内容DLRTree(treeNode->left); /显示左子树内容
12、DLRTree(treeNode->right); /显示右子树内容 /*中序遍历算法*/void LDRTree(CBTType *treeNode)if (treeNode)LDRTree(treeNode->left); /显示左子树内容 ShowNodeData(treeNode); /显示结点内容DLRTree(treeNode->right); /显示右子树内容 /*后序遍历算法*/void LRDTree(CBTType *treeNode)if (treeNode)LRDTree(treeNode->left); /显示左子树内容 DLRTree(tre
13、eNode->right); /显示右子树内容 ShowNodeData(treeNode); /显示结点内容char find(int theKey,CBTType* root)CBTType *p = root;while (p != NULL)if (theKey < p->leftSize)p = p->left;elseif (theKey > p->leftSize)theKey -= (p->leftSize+1);p = p->right;elsereturn p->data;/return NULL;struct Tree
14、Nodestruct TreeNode* left;struct TreeNode* right;char elem;void BinaryTreeFromOrderings(char* inorder, char* preorder, int length)if (length = 0)/cout<<"invalid length"return;TreeNode* node = new TreeNode;/Noice that new should be written out.node->elem = *preorder;int rootIndex =
15、 0;for (; rootIndex < length; rootIndex+)if (inorderrootIndex = *preorder)break;/LeftBinaryTreeFromOrderings(inorder, preorder + 1, rootIndex);/RightBinaryTreeFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1);cout << node->elem << ' '
16、return;/*主函数部分*/int main() int cycle = 1;while (cycle = 1)/主循环int x;cout << "-" << endl;cout << " 主菜单 " << endl;cout << "*" << endl;cout << "*0.退出 *" << endl; cout << "*1.对二叉树进行操作 *" << endl
17、;cout << "*2.输入前序序列和中序序列转为后序*" << endl;cout << "*" << endl;cin >> x;CBTType *root = NULL;switch (x)/二叉树操作case 1:char menusel;/设置根结点root = InitTree();/添加结点docout << "你想为二叉树添加结点吗?(y/n)" << endl;cin >> menusel;switch (menusel
18、)case 'y':AddTreeNode(root);break;case 'n':break;default:cout << "添加结点错误!" << endl;break; while (menusel != 'n');/输出树的深度 cout << "-" << endl;cout << "二叉树建立完毕!" << endl;cout << "二叉树树高为:" <<
19、 TreeDepth(root) << endl;/输出结点内容cout << "二叉树节点个数:" << num << endl;cout << "-" << endl;docout << "请选择菜单遍历二叉树,输入0表示退出:" << endl;cout << "1.层次遍历" << endl;cout << "2.先序遍历" << endl;co
20、ut << "3.中序遍历" << endl;cout << "4.后序遍历" << endl;cout << "-" << endl;cin >> menusel;switch (menusel)case '0':break;case '1':cout << "按层遍历的结果:" << endl;LevelTree(root);cout << endl;break;case '2':cout << "先序遍历的结果:" << endl;DLRTree(root);cout << endl;break;case '3':cout << "中序遍历的结果:" << endl;LDRTree(root);cout &
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创业投资资产管理合同(2篇)
- 2024年度天津市公共营养师之二级营养师综合检测试卷B卷含答案
- 2024年度四川省公共营养师之四级营养师模拟考核试卷含答案
- 草藤制品行业市场发展及发展趋势与投资战略研究报告
- 2024-2025年中国中间件软件行业市场调研分析及投资战略咨询报告
- 交流马达变频器行业市场发展及发展趋势与投资战略研究报告
- 塑胶零配件项目可行性研究报告
- 2024年生态循环工业园区市场分析报告
- 中国竹木工艺礼盒项目投资可行性研究报告
- 2025家庭装修工程合同范本
- 2024智能变电站新一代集控站设备监控系统技术规范部分
- 企业反恐专项经费保障制度
- 电梯工程师在电梯设计中的工作内容
- 《概率论与数理统计基础》全套教学课件
- 2024国家开放大学电大本科《液压气动技术》期末试题及答案
- 肥猪销售合同模板
- 餐饮顾问合作协议
- 新教材牛津译林版高中英语必修第二册全册各单元重点语法精讲
- 两课 说课 单相桥式整流电路分析(获奖)
- 中国移动《下一代全光骨干传送网白皮书》
- 消费者行为学智慧树知到期末考试答案章节答案2024年浙江大学
评论
0/150
提交评论