链式树

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. Adobe Flash player 10 提示:Error#2044:未处理的IOErrorEvent. text=Error#2036:加载未完成 的解决方法
  2. python编程基础是什么-编程学习第一步,让你20天搞定Python编程
  3. Java注解库_Java 注解详解
  4. eclipse php uml,Eclipse UML插件Amateras UML及GEF安装与用法
  5. java fx 内置图标_图标 – 如何在Windows上为javafx本机程序包图标设置自定义图标...
  6. poj1753_flipgame_枚举
  7. 自治时代:Oracle 公有云离我们很近,自治数据库离我们还远
  8. ----------------------------------------spring 整合jdbc---------------------
  9. kmeans中的k的含义_《K-means》知识点与思考
  10. axure如何页面滑动时广告位上移_Axure案例:滑动输入,学会这一招,你就能超越80%的人...
  11. BZOJ1934: [Shoi2007]Vote 善意的投票
  12. css设置遮罩层(半透明)
  13. activiti工作流简介
  14. wifi 协议栈的历史的总结
  15. 商家自研美团闪购开放平台SDK对接
  16. 大型门户网站架构分析
  17. DSP TMS320C5509A 控制DDS AD9854芯片驱动
  18. 分销小程序功能有哪些?如何使用分销小程序实现裂变卖货?
  19. Gartner 魔力象限:云基础设施和平台服务 2020年
  20. Gartner 2019年EPP(终端防护)魔力象限(Endpoint protection platforms)

热门文章

  1. 大陆计算机科学家排名,韩家炜、张宏江2位校友在世界顶尖计算机科学家排名中分别位居华人科学家和中国大陆科学家之首...
  2. 人人开源搭建后台管理系统
  3. MySQL 约束语法
  4. 电子书PDF网站大全
  5. ARM指令集 --RISC精简指令集
  6. python培训大数据分析师_CPDA数据分析师需要深入的学习python等工具吗?
  7. 利用C++求坐标系中两点间距离
  8. linux安装i3wm桌面环境,ArchLinux + i3wm 桌面 Windows10 双系统安装(重点记录)
  9. 游戏开发中常见的10种编程语言
  10. UR+RealSense手眼标定(eye-to-hand)