数据结构实验六二叉树操作代码实现_第1页
数据结构实验六二叉树操作代码实现_第2页
数据结构实验六二叉树操作代码实现_第3页
数据结构实验六二叉树操作代码实现_第4页
数据结构实验六二叉树操作代码实现_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论