先序,中序,后序线索二叉树

 //后序线索,这种方法不容易想到
1
#include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 6 using namespace std; 7 8 struct TREE{ 9 int val; 10 TREE *ch[2]; 11 TREE *thread;//该节点的线索的下一个节点 12 TREE(){} 13 TREE(int val){ 14 this->val = val; 15 ch[0] = ch[1] = NULL; 16 thread = NULL; 17 } 18 }; 19 20 void buildT(TREE * &T){ 21 int x; 22 scanf("%d", &x); 23 if(x == -1) return ; 24 25 T = new TREE(x); 26 buildT(T->ch[0]); 27 buildT(T->ch[1]); 28 } 29 30 31 void postThread(TREE *T, TREE *pre){ 32 if(!T) return; 33 postThread(T->ch[0], T); 34 postThread(T->ch[1], T); 35 if(pre){ 36 if(pre->ch[0] == T && pre->ch[1])//T是左子树 37 T->thread = pre->ch[1]; //T的下一个节点就是它的兄弟节点 38 else //T是右子树 39 T->thread = pre;//T的下一个节点就是它 的父亲节点 40 } 41 } 42 43 void printT_pre(TREE *T){//前序打印 44 if(!T) return ; 45 printf("%d ", T->val); 46 printT_pre(T->ch[0]); 47 printT_pre(T->ch[1]); 48 } 49 50 void printT_Thread(TREE *T){//后序线索打印 51 TREE *root = T; 52 bool flag = true;//表明T所在的字数没有访问过 53 while(1){ 54 while(flag && T->ch[0]) T = T->ch[0]; 55 printf("%d ", T->val); 56 if(T->thread->ch[0] == T || T->thread->ch[1] == T) 57 flag = false;//如果 T没有兄弟节点了,就一直沿着它的父节点向上走 58 else flag = true; 59 T = T->thread; 60 if(T == root){//再次回到最顶端父节点时, 结束! 61 printf("%d ", T->val); 62 break; 63 } 64 } 65 } 66 67 int main(){ 68 TREE *T = NULL; 69 buildT(T); 70 printT_pre(T); 71 printf("\n"); 72 postThread(T, NULL); 73 printT_Thread(T); 74 printf("\n"); 75 return 0; 76 }

 下面是基本按照同样的套路实现二叉树的先序,中序,后序的线索

//先序线索
#include<stdio.h> #include<stdlib.h> #define Thread 1 #define Tlink 0 typedef struct tree {int d;struct tree* lchild;struct tree* rchild;int Ltag, Rtag; }*TREE;void build_tree(TREE &T) {int d;scanf("%d", &d);if(d!=-1){T=(TREE)malloc(sizeof(tree));T->d=d;T->lchild=T->rchild=NULL;T->Ltag=T->Rtag=Tlink;build_tree(T->lchild);build_tree(T->rchild);} } TREE pre;void preThread_tree(TREE p) {if(p){if(!p->lchild){p->lchild=pre;p->Ltag=Thread;}if(!pre->rchild){pre->rchild=p;pre->Rtag=Thread;}pre=p;if(p->Ltag==Tlink)//考虑到只有一个结点或两个节点情况, preThread_tree(p->lchild);//如果没有 if语句可能出现死循环 if(p->Rtag==Tlink)preThread_tree(p->rchild);} }void print_preThr_tree(TREE T) {TREE p=T;while(1){ while(p->Ltag==Tlink){printf("%d ", p->d);p=p->lchild;}printf("%d ", p->d);p=p->rchild;if(p==T) break;while(p->Rtag==Thread){printf("%d ", p->d);p=p->rchild;}} }void print_tree(TREE T) {if(T){printf("%d ", T->d);print_tree(T->lchild);print_tree(T->rchild);} }int main() {TREE T=NULL;build_tree(T);print_tree(T);//递归先序遍历 printf("\n"); pre=T;preThread_tree(T);//非递归先序遍历 pre->rchild=T;print_preThr_tree(T);return 0; }

 

//中序线索
#include<stdio.h> #include<stdlib.h> #define Thread 1 #define Tlink 0 typedef struct tree {int d;struct tree* lchild;struct tree* rchild;int Ltag, Rtag; }*TREE;void build_tree(TREE &T) {int d;scanf("%d", &d);if(d!=-1){T=(TREE)malloc(sizeof(tree));T->d=d;T->lchild=T->rchild=NULL;T->Ltag=T->Rtag=Tlink;build_tree(T->lchild);build_tree(T->rchild);} } TREE pre;void inorThread_tree(TREE p) {if(p){if(p->Ltag==Tlink)//当只有一个结点的时候,要加上这句话 inorThread_tree(p->lchild);if(!p->lchild){p->lchild=pre;p->Ltag=Thread;}if(!pre->rchild){pre->rchild=p;pre->Rtag=Thread;}pre=p;if(p->Rtag==Tlink)inorThread_tree(p->rchild);} }

/*
上述代码可以简化如下,pre的初值为NULL就好  
void inorThread_tree(TREE p)
{if(p){  inorThread_tree(p->lchild);if(!p->lchild){p->lchild=pre;p->Ltag=Thread; } if(pre && !pre->rchild) { pre->rchild=p; pre->Rtag=Thread; } pre=p;  inorThread_tree(p->rchild); } }
*/void print_tree(TREE T){if(T){print_tree(T->lchild);printf("%d ", T->d);print_tree(T->rchild);}
}void print_inorThr_tree(TREE T)
{TREE p=T;while(1){while(p->Ltag==Tlink)p=p->lchild;printf("%d ", p->d);while(p->Rtag==Thread){p=p->rchild;printf("%d ", p->d);}p=p->rchild;if(p==T)break;}
}int main()
{TREE T=NULL;build_tree(T);print_tree(T);//递归中序遍历 printf("\n");    pre=T;inorThread_tree(T);//非递归中序遍历 pre->rchild=T;pre->Rtag=0;//保证只有一个结点的情况 
   print_inorThr_tree(T);return 0;
}

//后序线索
#include<stdio.h> #include<stdlib.h> #define Thread 1 #define Tlink 0 typedef struct tree {int d;struct tree* lchild;struct tree* rchild;struct tree* rrchild;int Ltag, Rtag; }*TREE;void build_tree(TREE &T) {int d;scanf("%d", &d);if(d!=-1){T=(TREE)malloc(sizeof(tree));T->d=d;T->lchild=T->rchild=NULL;T->Ltag=T->Rtag=Tlink;build_tree(T->lchild);build_tree(T->rchild);} } TREE pre;void postThread_tree(TREE p) {if(p){if(p->Ltag==Tlink)postThread_tree(p->lchild);if(p->Rtag==Tlink)postThread_tree(p->rchild);if(!p->lchild){p->lchild=pre;p->Ltag=Thread;}if(!pre->rchild ){pre->rchild=p;pre->Rtag=Thread;} else {pre->rrchild=p;}pre=p;} }void print_postThr_tree(TREE T) {TREE p=T;while(p->Ltag==Tlink)p=p->lchild;while(1){ printf("%d ", p->d);if(p==T)break; if(p->Rtag == Thread)p=p->rchild;else p=p->rrchild;} }void print_tree(TREE T) {if(T){print_tree(T->lchild);print_tree(T->rchild);printf("%d ", T->d);} }int main() {TREE T=NULL;build_tree(T);print_tree(T);//递归后序遍历 printf("\n"); pre=T;postThread_tree(T);//非递归后序遍历 pre->rchild=T;pre->Rtag = Thread; print_postThr_tree(T); return 0; }

 

转载于:https://www.cnblogs.com/hujunzheng/p/3983037.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle的todate函数 不用英文,关于在mybaties 和 oracle的to_date函数的问题?

ITMISSD)TO_DATE使用详解时常使用to_date函数来查询特定时间内的数据。语法&#xff1a;TO_DATE(x [, format])用于将字符串x转换为时间值&#xff0c;该函数可以指定一个可选的字符串format参数来说明x的格式。如果没有指定format参数&#xff0c;日期就使用默认的数据库格式(…

oracle 字段除以1000,ORACLE常用}1000(之一)_oracle

大家在oracle的r候可能龅胶芏嗫雌聿浑y的}, 特eπ率碚f, 今天我伟阉Y一下, l布o大家, 希望Υ蠹矣助! 和大家一起探, 共同M步!     ORACLE高手碚f是不用看的. 1. Oracle安b完成后的初始口令?   internal/oracle   sys/change_on_install   system/manager   scott/…

oracle 10g rac 修改sga_target不生效,Oracle Rac 修改SGA_TARGET值无变化

Oracle Rac 修改SGA_TARGET值无变化发布时间&#xff1a;2020-08-13 23:02:13来源&#xff1a;ITPUB博客阅读&#xff1a;93作者&#xff1a;dmcatding系统&#xff1a;Red Hat Enterprise Linux Server release 6.4 (Santiago)数据库&#xff1a;Oracle 11.2.0.4.1710171、 al…

oracle表空间 设置,Oracle表空间怎么设置和管理

前言表空间是 Oracle 特有的一种逻辑结构&#xff0c;是管理和组织 Oracle 数据文件一种方式&#xff0c;一个Oracle 数据库能够有一个或多个表空间&#xff0c;而一个表空间则对应一个或多个物理的数据库文件。Oracle 的表空间分为永久空间和临时表空间&#xff0c;同时又分为…

2014 网选 5024 Wang Xifeng's Little Plot

题意&#xff1a;从任意一个任意一个可走的点开始找一个最长的路&#xff0c;这条路如果有转弯的话&#xff0c; 那么必须是 90度&#xff0c;或者没有转弯&#xff01; 思路&#xff1a; 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 &#xff01; step[i][…

Adobe InDesign各版本安装指南

下载链接 https://pan.baidu.com/s/11sTpMUbQEXhyjpkBlixcLg?pwd0531 #2024版 1.鼠标右击【Ai2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Ai2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Setup】选择【以…

怎样永久更改嵌入式linux系统ip,如何修改嵌入式系统IP

如何修改嵌入式系统IP(2012-06-05 01:36:56)标签&#xff1a;嵌入式如何杂谈如何修改嵌入式系统IP我的嵌入式设备的根文件系统是用busybox作的&#xff0c;现在我想在程序里面更改它的IP地址等网络信息&#xff0c;但是没有找到方法&#xff0c;希望有知道的给我帮助&#xff0…

codeforces MUH and Cube Walls

题意&#xff1a;给定两个序列a ,b, 如果在a中存在一段连续的序列使得 a[i]-b[0]k, a[i1]-b[1]k.... a[in-1]-b[n-1]k 就说b串在a串中出现过&#xff01;最后输出b串在a串中出现几次&#xff01; 思路&#xff1a; KMP变形&#xff01;如何转换成KMP求解呢&#xff1f; 举一个例…

java模仿qq好友面板的布局(BoxLayout问题)

..............JLabel ll new JLabel(dlg.getNameText() ":" dlg.getIPText(), ii[index], JLabel.LEFT);tmp new JPanel();//将标签添加到这个面板中tmp.setLayout(new FlowLayout(FlowLayout.CENTER));tmp.setBackground(new Color(255, 0, 255));/** BoxLayo…

codeforces C. Design Tutorial: Make It Nondeterministic

题意&#xff1a;每一个人 都有frist name 和 last name&#xff01; 从每一个人的名字中任意选择 first name 或者 last name 作为这个人的编号&#xff01;通过对编号的排序&#xff0c;得到每一个人 最终顺序&#xff01;比较中的序列能否得到给定输出的序列一致&#xff01…

codeforce A. Design Tutorial: Learn from Math

题意&#xff1a;将一个数拆成两个合数的和&#xff0c; 输出这两个数&#xff01;&#xff08;这道题做的真是TMD水啊&#xff09;开始的时候不知道composite numbers是啥意思&#xff0c;看了3遍才看懂.... 看懂之后又想用素数筛选法来做&#xff0c;后来决定单个判断一个数是…

codeforces B. Design Tutorial: Learn from Life

题意&#xff1a;有一个电梯&#xff0c;每一个人都想乘电梯到达自己想要到达的楼层&#xff01;从a层到b层的时间是|a-b|&#xff0c; 乘客上下电梯的时间忽略不计&#xff01;问最少需要多少的时间.... 这是一道神题啊&#xff0c;自己的思路不知不觉的就按照注解的思路走…

codeforces D. Design Tutorial: Inverse the Problem

题意&#xff1a;给定一个矩阵&#xff0c;表示每两个节点之间的权值距离&#xff0c;问是否可以对应生成一棵树&#xff0c; 使得这棵树中的任意两点之间的距离和矩阵中的对应两点的距离相等&#xff01; 思路&#xff1a;我们将给定的矩阵看成是一个图&#xff0c;a 到 b会有…

linux ssh 远程会话保存,远程SSH会话和流程在断开后运行的5种方法

SSH或安全Shell简单来说就是一个人可以远程访问其他用户的其他系统&#xff0c;但仅在命令行即非GUI模式的方法。 在更多的技术术语中&#xff0c;当我们ssh到其他用户在某些其他系统上并在该机器上运行命令时&#xff0c;它实际上创建一个伪终端并将其附加到登录用户的登录she…

java模拟一个简单的QQ

v 项目源码https://github.com/hjzgg/java_QQ v 标题效果package testFour;import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.I…

AC_Dream 1216 G - Beautiful People

题意&#xff1a;有n个人每人有一个力气值Si,美丽值Bi&#xff0c;满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以一起参见晚会&#xff0c;问最多有多少人可以一起参见晚会。思路&#xff1a; 我们根据S从小到大将所有人排序&#xff0c;然后看B最…

二级c语言程序设计bug,《C语言及程序设计》实践项目——发现Bug

返回&#xff1a;贺老师课程教学链接【项目1-sin泰勒展式中的错误】下面是sin函数的泰勒展式&#xff1a;(注&#xff1a;x取弧度值&#xff0c;而非角度值)编写了double mysin(double x)用于求sin值&#xff0c;却“死”在了123上。剧透一下&#xff0c;循环没有问题(当然问题…

AC_Dream 1224 Robbers(贪心)

题意&#xff1a;n个抢劫犯分别抢到的金钱是k1, k2, k3,...&#xff0c;一共得到的金钱是m&#xff0c; 但是在分钱的时候是按照x1/y, x2/y, x3/y,....的比例进行分配的&#xff01;这样的话 一些抢劫犯就会觉得不公平&#xff0c;不公平度为|xi/y - ki/m|(浮点运算)&#xff0…

codeforces B. Strongly Connected City(dfs水过)

题意&#xff1a;有横向和纵向的街道&#xff0c;每个街道只有一个方向&#xff0c;垂直的街道相交会产生一个节点&#xff0c;这样每个节点都有两个方向&#xff0c; 问是否每一个节点都可以由其他的节点到达.... 思路&#xff1a;规律没有想到&#xff0c;直接爆搜&#xff0…

Uvaoj 11248 Frequency Hopping(Dinic求最小割)

题意&#xff1a;1到n节点&#xff08;节点之间有一定的容量&#xff09;&#xff0c;需要流过C的流量&#xff0c;问是否可以&#xff1f;如果可以输出possible&#xff0c; 否则如果可以扩大任意一条边的容量 可以达到目的&#xff0c;那么输出possible option&#xff1a;接…