天勤数据结构代码——树基本操作
链式树
typedef struct BTNode {char data; //数据域struct BTNode *lchild;// 左指针域struct BTNode *rchild;// 右指针域
};
二叉排序树
typedef struct BTNode1 {int key; //关键字struct BTNode1 *lchild;// 左指针域struct BTNode1 *rchild;// 右指针域
};
线索树
typedef struct TBTNode {char data; //数据域int ltag, rtag;//线索标记,=0时则表示对应指针域为指针, =1表示对应指针域为线索,指向该结点的直接前驱(后继)struct TBTNode *lchild;// 左指针域struct TBTNode *rchild;// 右指针域
};
二叉树三种遍历
void Visit(BTNode *p) {//某种操作,例如输出等等,
}
void preorder(BTNode *p) { //先序遍历if (p != NULL) {Visit(p); // 某种操作preorder(p->lchild);preorder(p->rchild);}
}
void inorder(BTNode *p) { //中序遍历if (p != NULL) {inorder(p->lchild);Visit(p);inorder(p->rchild);}
}
void postorder(BTNode *p) { //后序遍历if (p != NULL) {postorder(p->lchild);postorder(p->rchild);Visit(p);}
}
求表达式(a-(b+c)*(d/e))存储在二叉链表为存储结构的二叉树中,求出该表达式的值
int op(int a, int b, char Op) { //运算函数 完成 a Op b 的运算if (Op == '+')return a + b;if (Op == '-')return a - b;if (Op == '*')return a * b;if (Op == '/') {if (b == 0) { //被除数不能为0return 0;}else {return a / b;}}
}
int comp(BTNode *p) { //仅使用于这一种算式int A, B;if (p != NULL) {if (p->lchild != NULL && p->rchild != NULL) { //左右子树都不为空/*后序遍历求其值*/A = comp(p->lchild);B = comp(p->rchild);return op(A, B, p->data);}else {return p->data - '0'; // 如果左右子树都为空,则为数值,直接返回对应数字 (因为定义时是char)}}return 0; //空树,返回0;
}
计算二叉树的深度
int getDepth(BTNode *p) {int LD, RD;if (p == NULL) {return 0;}else {LD = getDepth(p->lchild);RD = getDepth(p->rchild);return (LD > RD ? LD : RD) + 1;}
}
查找二叉树中 值等于key的节点是否存在,若存在将p指向该节点,否则将q赋值为NULL,data为int型
typedef struct BTNode2 {int data; //数据域struct BTNode2 *lchild;// 左指针域struct BTNode2 *rchild;// 右指针域
};
/*假设二叉树已经存在,且p指向其根节点*/
void search(BTNode2 *p, BTNode2 *&q, int key) {if (p != NULL) {if (p->data == key) {q = p;}else {search(p->lchild, q, key);search(p->rchild, q, key);}}
}
假设二叉树采用二叉链表存储结构存储,编写一个程序输出先序(中序,后序)序列中第k个结点的值。
int n = 0; //全局变量
int trave(BTNode *p, int k) { //先序if (p != NULL) {++n;if (k == n) {cout << p->data << endl;return 0;}trave(p->lchild,k);trave(p->rchild,k);}
}
int trave(BTNode *p, int k) { //中序if (p != NULL) {trave(p->lchild, k);++n;if (k == n) {cout << p->data << endl;return 0;}trave(p->rchild, k);}
}
int trave(BTNode *p, int k) { //后序if (p != NULL) {trave(p->lchild, k);trave(p->rchild, k);++n;if (k == n) {cout << p->data << endl;return 0;}}
}
层次遍历
void level(BTNode *p) {int front, rear; BTNode *que[maxSize]; //定义一个循环队列,记录要访问的层次上的节点front = rear = 0;BTNode *q; if (q != NULL) {rear = (rear + 1) % maxSize;que[rear] = p; //根节点入队while (front != rear) {front = (front + 1) % maxSize;q = que[front]; //队头节点 出队Visit(p);if (q->lchild != NULL) {rear = (rear + 1) % maxSize;que[rear] = q->lchild;}if (q->rchild != NULL) {rear = (rear + 1) % maxSize;que[rear] = q->lchild;}}}
}
计算二叉树宽度
typedef struct St {BTNode *p;int lno; //节点所在层号
};
int maxNode(BTNode *b) {St que[maxSize]; //定义顺序队列int front = 0, rear = 0; int Lno,n,max;BTNode *q;if (b != NULL) {++rear;que[rear].p = b; //树根入队 que[rear].lno = 1; //层数为1while (front != rear) {++front;q = que[front].p;Lno = que[front].lno; //取当前节点 层号if (q->lchild != NULL) {++rear;que[rear].p = q->lchild;que[rear].lno = Lno + 1;}if (q->rchild != NULL) {++rear;que[rear].p = q->rchild;que[rear].lno = Lno + 1;}} //循环结束时,Lno 中保存的时这颗二叉树的最大层数(高度)max = 0;for (int i = 0; i < Lno; ++i) {n = 0;for (int j = 1; j <= rear; ++j) {if (que[j].lno == i) {++n;}if (max < n) {max = n;}}}return max;}elsereturn 0;
}
二叉树遍历的非递归算法(先,中,后)
void preorderNonrecursion(BTNode *bt) { //先序遍历if (bt != NULL) {BTNode *Stack[maxSize]; int top = -1;BTNode *p;Stack[++top] = bt;while (top != -1) {p = Stack[top--];Visit(p);if (p->rchild != NULL) {Stack[++top] = p->rchild;}if (p->lchild != NULL) {Stack[++top] = p->lchild;}}}
}
void inorderNonrecursion(BTNode *bt) { //中序遍历if (bt != NULL) {BTNode *Stack[maxSize];int top = -1;BTNode *p;p = bt;while (top != -1||p != NULL) {while (p != NULL) {Stack[++top] = p;p->lchild;}if (top != -1) {p = Stack[top--];Visit(p); p = p->rchild;}}}
}
void postorderNonrecursion(BTNode *bt) { //后序遍历if (bt != NULL) {BTNode *Stack1[maxSize];int top1 = -1;BTNode *Stack2[maxSize];int top2 = -1;BTNode *p = NULL;Stack1[++top1] = bt;while (top1 != -1) {p = Stack1[top1--];Stack2[++top2] = p;if (p->lchild != NULL) {Stack1[++top1] = p->lchild;}if (p->rchild != NULL) {Stack2[++top1] = p->rchild;}}while (top2 != -1) {p = Stack2[top2--];Visit(p); }}
}
根据先序和中序遍历构造出二叉树
BTNode *CreateBT(char pre[], char in[], int l1, int r1, int l2, int r2) {BTNode *s;int i;if (l1 > r1) { return NULL; }BTNode *s = new BTNode;s->lchild = s->rchild = NULL;for (int i = l2; i < r2; i++) { //查找等于当前子树根的节点再中序的位置if (in[i] == pre[l1]) {break;}}s->data = in[i]; s->lchild = CreateBT(pre, in, l1 + 1, l1 + i - 12, 12, i - 1);s->rchild = CreateBT(pre, in, l1 + i - 12 + 1, r1, i + 1, r2);return s;
}
计算二叉树所有的节点数
int n = 0; //非递归
void count(BTNode *p) {if (p != NULL) {++n;count(p->lchild);count(p->rchild);}
}
int count2(BTNode *p) { //递归int n1, n2;if (p == NULL) {return 0;}else {n1 = count2(p->lchild);n2 = count2(p->rchild);return n1 + n2 + 1;}
}
计算二叉树的所有叶子节点数
int n = 0; //非递归
void count3(BTNode *p) {if (p != NULL) {if (p->lchild == NULL && p->rchild == NULL) {++n;}count3(p->lchild);count3(p->rchild);}
}
int count4(BTNode *p) { //递归int n1, n2;if (p == NULL) {return 0;}else if (p->lchild == NULL && p->rchild == NULL) {return 1;}else {n1 = count4(p->lchild);n2 = count4(p->rchild);return n1 + n2;}
}
利用节点的右孩子指针rchild 将一棵二叉树的叶子节点从左往右的顺序串成一个单链表(在题目中定义两个指针,head和tail,其中hear 指向第一个叶子节点,head初值为NUll,tail指向最后一个叶子节点)
void link(BTNode*p, BTNode*head, BTNode*&tail) {if (p != NULL) {if (p->lchild == NULL && p->rchild == NULL) { //叶子节点if (head == NULL) { //第一个节点,head = p;tail = p;}else { //非第一个节点tail->rchild = p;tail = p;}}link(p->lchild, head, tail);link(p->rchild, head, tail);}
}
在二叉树的二叉链表存储结构中,增加一个指向双亲结点的parent指针,设计一个算法给这个指针赋值,并且输出所有节点到根节点的路径。
typedef struct BTNode3 {char data;struct BTNode3*parent;struct BTNode3*lchild;struct BTNode3*rchild;
};
void triBtree(BTNode3*p, BTNode3 *q) { //给parent赋值 p为根节点的时候,q应为NULLif (p != NULL) {p->parent = q; //当前所访问的节点的parent 指向q;q = p; triBtree(p->lchild, q);triBtree(p->rchild, q);}
}
void printPath(BTNode3 *p) { //打印路径while (p != NULL) {cout << p->data << " " << endl;p->parent;}
}
void allPath(BTNode3 *p) { //打印所有路径if (p != NULL) {printPath(p);allPath(p->lchild);allPath(p->rchild);}
}
假设先序遍历序列储存在数组中,将其转变为后序遍历
void change(char pre[], int L1, int R1, char post[], int L2, int R2) {if (L1 <= R1) {post[R2] = pre[L1]; //将 pre的第一个元素放在post的末尾change(pre, L1 + 1, (L1 + 1 + R1) / 2, post, L2, (L2 + R2 - 1) / 2);change(pre, (L1 + 1 + R1) / 2 + 1, R1, post, (L2 + R2 - 1) / 2 + 1, R2 - 1);}
}
求二叉树中 值为x的节点的层号(高度)
int L = 1; //全局变量
void leno(BTNode *p, char x) {if (p != NULL) {if (p->data == x) {cout << L << endl;}++L; //去往下层 leno(p->lchild, x);leno(p->rchild, x);--L; //回到上层}
}
双序遍历 (中左中右)
void Double_order(BTNode *t) {if (t != NULL) {Visit(t);Double_order(t->lchild);Visit(t);Double_order(t->rchild);}
}
输出根节点到所有结点的路径
int i;
int top = 0;
char pathstack[maxSize];
void allPath(BTNode *p) {if (p != NULL) {pathstack[top] = p->data;++top;if (p->lchild == NULL && p->rchild == NULL) { //叶子节点for (i = 0; i < top; ++i) {cout << pathstack[i]; //打印路径}}allPath(p->lchild);allPath(p->rchild);--top;}
}
天勤数据结构代码——树基本操作相关推荐
- 天勤数据结构代码——栈基本操作
顺序栈 typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释.int top; //栈顶下标( ...
- 天勤数据结构代码——链表基本操作
结构定义 typedef struct LNode {int data; // 数据域(可以是其他类型)struct LNode *next;//指针域 (此处代表指向后驱节点) }; A和B是两个单 ...
- 天勤数据结构:树与二叉树(图解二叉树的三种遍历方式执行流程,超详细)
数据结构(第六章) 树与二叉树 1. 树与二叉树的相互转换 2. 森林与二叉树的相互转换 3. 二叉树的遍历 3.1 层序遍历(广度优先遍历) 2. 深度优先遍历 3. 树转化为二叉树的遍历 将一颗 ...
- 【天勤|数据结构】树
1.1 树的定义 树是一种非线性的数据结构 树的定义是递归的,即在树的定义中又用到了树的定义 1.2 树的基本术语 结点的度 树的度 叶子结点 非终端结点 孩子 双亲 兄弟 祖先 子孙 层次 树的高度 ...
- 天勤数据结构-代码题2
已知一个带有表头节点的单链表,节点结构为:{data,next},假设该链表只给出了头指针head,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点.查找成功返回该结 ...
- 数据结构树的基本操作_《数据结构》树的基本操作.doc
<数据结构>树的基本操作 实验四 课程名称:完成日期:姓名:学号:指导教师:实验名称:实验序号:实验成绩:一.实验目的及要求 二.实验环境.实验内容 求出它的深度. .调试过程及实验结果 ...
- 树的数据结构代码_如何以无代码方式学习树数据结构
树的数据结构代码 The tree data structure can form some of the most useful and complex data structures in all ...
- 【数据结构】初入数据结构的树(Tree)以及Java代码实现(一)
初入数据结构的树(Tree)以及Java代码实现(一) 树的定义 为什么叫树? 树型结构的元素具有一对多关系 树的定义 树的一些基本概念 树的结点 后代,祖先 子树.空树 树的度与高(深度),结点的度 ...
- 数据结构之树与二叉树
数据结构之树与二叉树 1.树的概念及结构 1.1.什么是树? 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.树是递归定义的.之所以把它叫做树是因为它看起来像 ...
- 王道考研数据结构代码总结(前四章)
目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...
最新文章
- Java语言基础--字符串
- [转]CentOS 7忘记root密码解决办法
- ubuntu安装python3.8_Ubuntu 16.04 安装 python3.8
- 解决IntelliJ Idea中文乱码问题、修改IDEA编码
- 数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)
- 西门子和阿里云要搞啥事情?| 极客头条
- 影响网络OA系统成功实施的技术因素浅析
- 学生信息管理系统(c++源代码实现)
- JAVA多线程----用--取钱问题1
- Python 3.65 安装geopandas
- Atitit。Time base gc 垃圾 资源 收集的原理与设计
- 通信原理第三章 模拟调制系统
- MySQL数据库安全配置规范操作
- 怎么安全的清理WinSxS文件夹?
- 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
- 卡西欧5800程序集 第15篇 任意斜交角度坐标反算通用程序
- vulnhub——Bulldog1
- web页面-电子签名
- 高考倒计时一天,加油!
- Wandb:深度神经网络可视化工具介绍及本地部署方式
热门文章
- 伍德里奇计量经济学导论pdf_伍德里奇 计量经济学导论 第三章第三节-1 MLR1-MLR4...
- Scrapy爬取QQ音乐、评论、下载、歌曲、歌词
- linux麒麟认证,【麒麟在线讲堂】优麒麟生物特征认证系统-03驱动开发
- minecraft我的世界服务器自动备份脚本
- AWG#线规及其载流能力和电阻值
- MergeSort(合并排序)
- UG12.0基础绘图3D建模造型 工程图视频教程
- 富文本编辑器Editor.md入门
- 利用ziparchive压缩文件、zip_file解压文件
- XJad反编译工具下载链接及使用教程