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

 //后序线索,这种方法不容易想到
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,一经查实,立即删除!

相关文章

cdp备份适合oracle吗,备份系统建设中的四个认识误区,你有吗?

【摘要】本文总结了企业在备份建设中常见的四个认识误区。【作者】李志刚企业在备份建设中&#xff0c;主要的认识误区有以下几个&#xff1a;一、用双机、阵列复制等系统冗余替代数据备份双机双柜可实现服务器和存储的高可用性&#xff0c;保障业务持续运行&#xff0c;但绝不…

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor's Performance Art

1 #include<iostream>2 #include<cstring>3 #include<cstdio>4 #include<algorithm>5 #define N 10000056 using namespace std;7 8 int c[35];9 int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色&#xff0c;-1表示的是非纯色 10 int n, m; …

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

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

2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)

1 /*2 这是我做过的一道新类型的搜索题&#xff01;从来没想过用四维数组记录状态&#xff01;3 以前做过的都是用二维的&#xff01;自己的四维还是太狭隘了.....4 5 题意&#xff1a;悟空救师傅 &#xff01; 在救师父之前要先把所有的钥匙找到&#xff01;6…

oracle move 换用户,Oracle move方法释放delete后的表空间

在新增记录时,高水位线会慢慢往上移,但是在删除记录后,高水位线却不会往下移。在使用delete from命令删除大量数据时会导致因HWM引起的性能问题。删除高水位的最直接的方法是truncate Table。-----Oracle 频繁delete表空间无法释放&#xff0c;释放表空间方法&#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/…

java中图片文件的判断

javax.imageio 类 ImageIO BufferedImage bi ImageIO.read(resFile);//resFile --- InputStreamif(bi null){ System.out.println(此文件不为图片文件); }try {//判断是否为图片文件并且返回图片的格式&#xff01;ImageInputStream iis ImageIO.createImageInputStream(o)…

oracle 查看数据库性能,oracle 11G使用statspack查看数据库的性能

1.安装Statspack工具(statspack工具的脚本在$ORACLE_HOME/rdbms/admin目录下,全是以sp开头的文件)[oracleoracle ~]$ sqlplus / as sysdbasql> select file_name,tablespace_name from dba_data_files;FILE_NAMETABLESPACE_NAME-------------------------------------------…

java中JTextPane使输出字符到指定的宽度换行,并将垂直滚动条的位置移动到输出的最后位置...

SimpleAttributeSet set new SimpleAttributeSet();Document doc tp.getStyledDocument(); FontMetrics fm tp.getFontMetrics(tp.getFont());//得到JTextPane 的当前字体尺寸int paneWidth tp.getWidth();//面板的宽度String text new String(bt, 0, len);  try{for(int…

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…

codeforces George and Job

1 /*2 题意&#xff1a;给一个长度为n的序列&#xff0c; 从中选择长度为m的k个区间&#xff08;任意两个区间不会有公共部分&#xff09;3 使得所选择的区间的和最大&#xff01;4 思路&#xff1a;这是一种很常见的dp5 6 dp[i][j] 表示的是前 i 个数选择…

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][…

aix升级新安装oracle,AIX 5L上安装和升级Oracle

1、检查环境检查硬件与OS位数&#xff0c;一定确保64bit#bootinfo -y64#bootinfo -K64检查内存大小&#xff0c;至少需要512M以上#/usr/sbin/lsattr -E -l sys0 -a realmemrealmem 12582912 Amount of usable physical memory in Kbytes False 临时目录的大小&#xff0c;至少5…

Adobe InDesign各版本安装指南

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

java中如何将JScrollPane的垂直滚动条自动移动到最下端

JPanel QQP new JPanel();              JScrollPane jsp new JScrollPane(QQP);              JScrollBar jsb jsp.getVerticalScrollBar();QQP.updateUI();//利用当前外观的值重置 UI 属性。 也可以保证滚动条随时的更新//终于搞好了&#xf…

codeforces MUH and Important Things

/*   题意&#xff1a;给一个序列&#xff0c;表示每一项任务的难度&#xff0c;要求完成每一项任务的循序是按照难度由小到大的&#xff01;输出三种符合要求的工作顺序的序列&#xff01;   思路&#xff1a;直接看代码.... */ 1 #include<iostream>2 #include<…

oracle11g ogg报价,Oracle11g GoldenGate配置错误OGG-00868 Attaching to ASM server

GGSCI (CBDBS01) 9> start eiexaa错误&#xff1a;2011-02-24 10:32:45 ERROR OGG-00868 Oracle GoldenGate Capture for Oracle, eiexaa.prm: Attaching to ASM server CBOMS:1568/ASM1: (12154) ORA-12154: TNS:could not resolve the connect identifier specified.…

Linux启动更新命令,Linux更新和查询命令chkconfig详细介绍

chkconfig在Linux下是管理服务/启动项在各个系统运行级别中的设置&#xff0c;在Linux中系统有7个运行级别&#xff0c;分别是&#xff1a;1.运行级别0&#xff1a;表示关机2.运行级别1&#xff1a;表示单用户模式3.运行级别2&#xff1a;无网络连接的多用户命令行模式4.运行级…

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

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