链式树

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;}
}

天勤数据结构代码——树基本操作相关推荐

  1. 天勤数据结构代码——栈基本操作

    顺序栈 typedef struct SqStack {int data[maxSize]; //存放栈元素,数组大小,要开足够大(一般题目给)不给就开足够大,写注释.int top; //栈顶下标( ...

  2. 天勤数据结构代码——链表基本操作

    结构定义 typedef struct LNode {int data; // 数据域(可以是其他类型)struct LNode *next;//指针域 (此处代表指向后驱节点) }; A和B是两个单 ...

  3. 天勤数据结构:树与二叉树(图解二叉树的三种遍历方式执行流程,超详细)

    数据结构(第六章) 树与二叉树 1. 树与二叉树的相互转换 2. 森林与二叉树的相互转换 3. 二叉树的遍历 3.1 层序遍历(广度优先遍历) 2. 深度优先遍历 3. 树转化为二叉树的遍历 将一颗 ...

  4. 【天勤|数据结构】树

    1.1 树的定义 树是一种非线性的数据结构 树的定义是递归的,即在树的定义中又用到了树的定义 1.2 树的基本术语 结点的度 树的度 叶子结点 非终端结点 孩子 双亲 兄弟 祖先 子孙 层次 树的高度 ...

  5. 天勤数据结构-代码题2

    已知一个带有表头节点的单链表,节点结构为:{data,next},假设该链表只给出了头指针head,在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点.查找成功返回该结 ...

  6. 数据结构树的基本操作_《数据结构》树的基本操作.doc

    <数据结构>树的基本操作 实验四 课程名称:完成日期:姓名:学号:指导教师:实验名称:实验序号:实验成绩:一.实验目的及要求 二.实验环境.实验内容 求出它的深度. .调试过程及实验结果 ...

  7. 树的数据结构代码_如何以无代码方式学习树数据结构

    树的数据结构代码 The tree data structure can form some of the most useful and complex data structures in all ...

  8. 【数据结构】初入数据结构的树(Tree)以及Java代码实现(一)

    初入数据结构的树(Tree)以及Java代码实现(一) 树的定义 为什么叫树? 树型结构的元素具有一对多关系 树的定义 树的一些基本概念 树的结点 后代,祖先 子树.空树 树的度与高(深度),结点的度 ...

  9. 数据结构之树与二叉树

    数据结构之树与二叉树 1.树的概念及结构 1.1.什么是树? 树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合.树是递归定义的.之所以把它叫做树是因为它看起来像 ...

  10. 王道考研数据结构代码总结(前四章)

    目录 线性表 基本操作 顺序表 顺序表的定义 顺序表的插入 顺序表的删除 静态分配顺序表的按位查找 动态分配顺序表的按位查找 动态分配顺序表的按值查找 链表 用代码定义一个单链表 不带头节点的单链表 ...

最新文章

  1. Java语言基础--字符串
  2. [转]CentOS 7忘记root密码解决办法
  3. ubuntu安装python3.8_Ubuntu 16.04 安装 python3.8
  4. 解决IntelliJ Idea中文乱码问题、修改IDEA编码
  5. 数据结构之二叉树:二叉查找树的先序、中序、后序、层序遍历,Python代码实现——10(续)
  6. 西门子和阿里云要搞啥事情?| 极客头条
  7. 影响网络OA系统成功实施的技术因素浅析
  8. 学生信息管理系统(c++源代码实现)
  9. JAVA多线程----用--取钱问题1
  10. Python 3.65 安装geopandas
  11. Atitit。Time base gc 垃圾 资源 收集的原理与设计
  12. 通信原理第三章 模拟调制系统
  13. MySQL数据库安全配置规范操作
  14. 怎么安全的清理WinSxS文件夹?
  15. 中国剩余定理求解同余线性方程组(模数互素和非互素的情况)
  16. 卡西欧5800程序集 第15篇 任意斜交角度坐标反算通用程序
  17. vulnhub——Bulldog1
  18. web页面-电子签名
  19. 高考倒计时一天,加油!
  20. Wandb:深度神经网络可视化工具介绍及本地部署方式

热门文章

  1. 伍德里奇计量经济学导论pdf_伍德里奇 计量经济学导论 第三章第三节-1 MLR1-MLR4...
  2. Scrapy爬取QQ音乐、评论、下载、歌曲、歌词
  3. linux麒麟认证,【麒麟在线讲堂】优麒麟生物特征认证系统-03驱动开发
  4. minecraft我的世界服务器自动备份脚本
  5. AWG#线规及其载流能力和电阻值
  6. MergeSort(合并排序)
  7. UG12.0基础绘图3D建模造型 工程图视频教程
  8. 富文本编辑器Editor.md入门
  9. 利用ziparchive压缩文件、zip_file解压文件
  10. XJad反编译工具下载链接及使用教程