博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法3--树常见操作
阅读量:4289 次
发布时间:2019-05-27

本文共 3899 字,大约阅读时间需要 12 分钟。

数据结构与算法3--树常见操作

 

树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。以下是笔者根据树的特性和平时使用情况完成的一些基本功能,后续将根据使用情况再增加相关功能。

 

1、功能

00-打印数组

01-新建树方法1
02-广度输出树
03-先序遍历树
04-中序遍历树
05-后续遍历树
06-树高度计算方法

 

2、代码

/*该文件夹包含tree的增删查改,以及常见tree算法的实现*/#include 
#include
#include
using namespace std;/* example 1 10 6 144 8 12 16pre = {10,6,4,8,14,12,16}mid = {4,8,6,12,16,14,10}example 2 1 2 34 5 6 7 8pre = {1,2,4,7,3,5,6,8}mid = {4,7,2,1,5,3,8,6} */typedef struct Node{ int val; Node *left; Node *right;}TreeNode;/*Menu00-打印数组01-新建树方法102-广度输出树03-先序遍历树04-中序遍历树05-后续遍历树06-树高度计算方法*/void PrintArray(const vector
&arr);//00TreeNode* CreateTree1(vector
pre, vector
mid);//01-1由前序遍历和中序遍历构建二叉树void PrintTreeBFS(TreeNode *pRoot);//02void PrintPreOrder(TreeNode *pRoot);//03void PrintInOrder(TreeNode *pRoot);//04void PrintLastOrder(TreeNode *pRoot);//05int GetHight(TreeNode *pRoot);//06-树高度计算方法//00-打印数组void PrintArray(const vector
&arr){ cout<<'['; for(int i=0;i
pre, vector
mid){ if(pre.size()==0 || mid.size()==0) return NULL; vector
lpre,lmid,rpre,rmid;//save leftsubtre pre、leftsubtree mid、rightsubstree pre、rightsubtree mid int i=0; for(i=0;i
val = pre[0]; root->left = CreateTree1(lpre,lmid); root->right = CreateTree1(rpre,rmid); return root;}void TestCreateTree1(){ int pre[] = {1,2,4,7,3,5,6,8}; int mid[] = {4,7,2,1,5,3,8,6}; vector
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); cout<<"pre:"; PrintArray(vpre); cout<<"mid:"; PrintArray(vmid); TreeNode *root = CreateTree1(vpre,vmid); PrintTreeBFS(root);}//02-广度输出树void PrintTreeBFS(TreeNode *pRoot){ if(pRoot==NULL) { cout<<"NULL"<
que; que.push(pRoot); while(que.size()!=0) { int len = que.size(); for(int i=0;i
val<<'\t'; if(p->left!=NULL) que.push(p->left); if(p->right!=NULL) que.push(p->right); que.pop(); } cout<
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); TreeNode *root = CreateTree1(vpre,vmid); PrintTreeBFS(root);}//03-先序遍历树void PrintPreOrder(TreeNode *pRoot){ if(pRoot==NULL) return ; cout<
val<<'\t'; PrintPreOrder(pRoot->left); PrintPreOrder(pRoot->right);}void TestPrintPreOrder(){ int pre[] = {1,2,4,7,3,5,6,8}; int mid[] = {4,7,2,1,5,3,8,6}; vector
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); PrintArray(vpre); PrintArray(vmid); TreeNode *root = CreateTree1(vpre,vmid); PrintPreOrder(root); cout<
left); cout<
val<<'\t'; PrintInOrder(pRoot->right); }void TestPrintInOrder(){ int pre[] = {1,2,4,7,3,5,6,8}; int mid[] = {4,7,2,1,5,3,8,6}; vector
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); PrintArray(vpre); PrintArray(vmid); TreeNode *root = CreateTree1(vpre,vmid); PrintInOrder(root); cout<
left); PrintLastOrder(pRoot->right); cout<
val<<'\t';}void TestPrintLastOrder(){ int pre[] = {1,2,4,7,3,5,6,8}; int mid[] = {4,7,2,1,5,3,8,6}; vector
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); PrintArray(vpre); PrintArray(vmid); TreeNode *root = CreateTree1(vpre,vmid); PrintLastOrder(root); cout<
left)>GetHight(pRoot->right)?(1+GetHight(pRoot->left)):(1+GetHight(pRoot->right));}void TestGetHight(){ int pre[] = {1,2,4,7,3,5,6,8}; int mid[] = {4,7,2,1,5,3,8,6}; vector
vpre(pre,pre+sizeof(pre)/sizeof(int)); vector
vmid(mid,mid+sizeof(mid)/sizeof(int)); TreeNode *root = CreateTree1(vpre,vmid); cout<
<

 

3、说明

当前已在mingw32(gcc 4.9.2)上测试通过。

 

 

转载地址:http://dflgi.baihongyu.com/

你可能感兴趣的文章
用递归方法建立二叉树
查看>>
用递归方法对二叉树进行先序、中序和后序遍历
查看>>
翻转二叉树
查看>>
逆序链表
查看>>
epoll 使用详解
查看>>
stl 中 set容器用法
查看>>
有序数组求交集
查看>>
文字常量区与栈
查看>>
非阻塞connect 编写方法
查看>>
epoll 边沿触发
查看>>
String类 默认生成的函数
查看>>
Linux 软连接与硬链接
查看>>
视音频数据处理入门:H.264视频码流解析
查看>>
视音频数据处理入门:AAC音频码流解析
查看>>
视音频数据处理入门:UDP-RTP协议解析
查看>>
视音频数据处理入门:FLV封装格式解析
查看>>
最简单的基于FFMPEG的封装格式转换器(无编解码)
查看>>
base64 编码原理
查看>>
单链表是否有环的问题
查看>>
判断两个链表是否相交并找出交点
查看>>