知树的前序遍历,后序遍历,怎么求中序遍历 数据结构二叉树,已知中序遍历、后序遍历,如何求先序遍历?
\u5df2\u77e5\u524d\u5e8f\u904d\u5386\u548c\u540e\u5e8f\u904d\u5386\uff0c\u600e\u4e48\u6c42\u53ef\u80fd\u7684\u4e2d\u5e8f\u904d\u5386\u4ec5\u4f9b\u53c2\u8003\uff0c
int creat(BiTree &T, ElemType pre[],ElemType post[],int low_x,int high_x,int low_h,int high_h)
{//\u6839\u636e\u5148\u5e8f\u5e8f\u5217\u548c\u540e\u5e8f\u5e8f\u5217\u5efa\u7acb\u4e8c\u53c9\u94fe\u8868\uff0c\u5148\u5e8f\u5e8f\u5217\u548c\u540e\u5e8f\u5e8f\u5217\u5b58\u4e8e\u4e00\u7ef4\u6570\u7ec4\u4e2d\uff0c\u56db\u4e2a\u6574\u578b\u53d8\u91cf\u8868\u793a\u6570\u7ec4\u7684\u8303\u56f4,0\u53f7\u5355\u5143\u7559\u7a7a\uff0c\u51fd\u6570\u8fd4\u56de\u53ef\u5efa\u7acb\u4e8c\u53c9\u6811\u7684\u6570\u76ee
count=1;
if(low_x>high_x || low_h >high_h) {T==NULL;return count;}
if(low_x high_h])
{
T=new BiNode;
T->data=pre.elem[low_x];
}
if(low_x+1= low_h)
{
if(pre [low_x+1] ! = post [high_h-1])
{
\u987a\u5e8f\u67e5\u627epre [low_x+1]\u5728\u540e\u5e8f\u5e8f\u5217\u7684\u4f4d\u7f6ea\uff1b
\u987a\u5e8f\u67e5\u627epost [high_h-1]\u5728\u5148\u5e8f\u5e8f\u5217\u7684\u4f4d\u7f6eb\uff1b
creat(T->lchild,pre,post,low_x+1,b-1,low_h,a);
creat(T->rchild,pre,post,b,high_x,a+1,high_h-1);
}
else if(pre [low_x+1] = = post [high_h-1])
{
count*=2;
\u8bf7\u9009\u62e9\u5efa\u7acb\u5de6\u5b50\u6811\u6216\u53f3\u5b50\u6811\uff0c\u5de6\u8f93\u51650\uff0c\u53f3\u8f93\u51651\uff0c\u7528L_R\u8868\u793a
cin>>L_R;
if(L_R= =0)
{
creat(T->lchild,pre,post,low_x+1,high_x,low_h,high_h-1);
creat(T->rchild,pre,post,1,0,1,0);
else {
creat(T->lchild,pre,post,1,0,1,0);
creat(T->rchild,pre,post,low_x+1,high_x,low_h,high_h-1);
}
}
if (low_x+1> high_x || high_h-1 < low_h)
{
creat(T->lchild,pre,post,1,0,1,0);
creat(T->rchild,pre,post, 1,0,1,0);
}
}
Preorder\u904d\u5386:\u8bbf\u95ee\u6839\u8282\u70b9\u7684\u64cd\u4f5c\u53d1\u751f\u5728\u904d\u5386\u5de6\u548c\u53f3\u5b50\u6811\u4e4b\u524d\u3002
\u4e2d\u95f4\u987a\u5e8f\u904d\u5386:\u8bbf\u95ee\u6839\u8282\u70b9\u7684\u64cd\u4f5c\u53d1\u751f\u5728\u5de6\u8fb9\u548c\u53f3\u8fb9\u7684\u5b50\u6811\u4e2d\u3002
\u987a\u5e8f\u904d\u5386:\u8bbf\u95ee\u6839\u8282\u70b9\u7684\u64cd\u4f5c\u53d1\u751f\u5728\u904d\u5386\u5de6\u8fb9\u548c\u53f3\u8fb9\u7684\u5b50\u6811\u4e4b\u540e\u3002
\u4e0b\u9762\u7684\u5e8f\u5217\u904d\u5386\u4e86DBCEFGHA\uff0c\u5e8f\u5217\u904d\u5386\u662fEDCBAHFG\uff0c\u4ee5\u53capreorder\u904d\u5386(\u5728\u7ebf\u793a\u4f8b)
\u89e3\u51b3\u65b9\u6848:\u9996\u5148\uff0c\u770b\u5230\u540e\u5e8f\u904d\u5386DBCEFGHA, A\u662f\u603b\u6839\u8282\u70b9\u3002
\u7136\u540e\u53d1\u73b0\u4e2d\u95f4\u987a\u5e8f\u904d\u5386A\u5728EDCBAHFG\u4e2d\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u5728A\u7684\u5de6\u5206\u652f\u4e0a\u7684EDCB\uff0c\u5728A\u7684\u53f3\u5206\u652f\u4e0a\u7684HFG;
\u91cd\u590d\u524d\u4e24\u4e2a\u6b65\u9aa4\uff0c\u6700\u540e\u4e00\u4e2a\u4ece\u540e\u5e8f\u904d\u5386\uff0c\u5728\u4e2d\u95f4\u987a\u5e8f\u904d\u5386\u4e2d\u641c\u7d22\u76f8\u5e94\u7684\u70b9\uff0c\u4ee5\u53ca\u5de6\u548c\u53f3\u5206\u652f\u2026
\u6700\u540e\uff0cAECDBHGF\u53ef\u4ee5\u81ea\u884c\u9a8c\u8bc1\u3002
二叉树是最为常用的数据结构,它的实际应用非常广泛。二叉树的遍历方式有三种,前序遍历、中序遍历、后序遍历。先序遍历的顺序为:NLR,即先根结点,然后左子树、右子树;中序遍历顺序为:LNR先左子树,然后根结点、右子树;后序遍历顺序为:LRN先左子树、然后右子树、根结点。由前序和中序遍历、由中序和后序遍历序列可以唯一确定一棵二叉树,而由前序和后序遍历序列不能唯一确定一棵二叉树。�
二叉排序树对二叉树作了进一步的限定:根结点的权值大于(或小于)左子树中所有结点的权值;根结点的权值小于(或大于)其右子树中所有结点的权值。�
那么如何根据三种遍历序列之间的关系及二叉排序树来快速还原一棵二叉树?下面以二叉树的前序和中序遍历序列为基础,利用二叉排序树的性质,给出快速还原二叉树的方法。�
1由给定前序和中序序列或中序和后序序列还原二叉树的方法�
例:前序序列:ABDECFGH 中序序列:DEBACGFH (后序序列:EDBGHFCA)�
(1)给中序序列中的每个结点从小到大、从左到右赋以权值,如下:�
D(1)E(2)B(3)A(4)C(5)G(6)F(7)H(8)�
(2)还原时读入的序列为前序序列,从左到右依次读入序列中的各个结点值和相应的权值; �
(3)由读入的序列,根据第1)步中给定的权值按照二叉排序树的构造规则构造二叉排序树。第一个读入的结点为根结点,其他结点分别为左右子树中的结点。设根结点为TT,权值为NN,当前读入结点为SS,权值为MM,若MM
(4)将SS插入到TT的左子树或右子树的过程中,仍然遵循3)中的规则,直至左子树或右子树为空时止。�
(5)读入序列结束时,二叉树还原成功。�
6)对于由中序序列和后序序列还原二叉树是,读入的序列为后序序列,从右向左读入,构造规则同上。还原结果与上述结果完全一致。�
2还原方法的确定依据�
二叉树遍历过程中,在中序序列中,根结点的左子树中的所有结点都在根结点的左侧,根结点的右子树中的所有结点都在根结点的右侧,这个特点恰好与二叉排序树具有相同的性质;在读入序列时,前序序列则从左向右读,这恰好与遍历二叉树的顺序相同;后序序列从右向左读,则按照根结点、右子树、左子树的顺序还原。�
(1)设二叉树共有N个结点(N为大于1的正整数),我们按照还原方法给中序序列中的这N个结点分别赋予权值1,2…N,设根结点的权值为M(1
(2)由二叉树的遍历规则可知,权值为1,2…M-1的结点为根结点的左子树中的结点,而权值为M+1,…N的结点为根结点的右子树中的结点。�
(3)将这N个结点划分成3个子集AA=(1,2…M-1)BB=(M)CC=(M+1,…N),由于前序序列第一个读入的结点必定为二叉根的根结点,所以BB为根结点,AA集为左子树,CC集为右子树。�
(4)同理不断读入前序序列中的结点,依次递归还原BB对应的左子树和CC对应的右子树,最后将三棵子树合并成以BB为根结点、AA的根结点为BB的左子树、CC的根结点为BB的右子树的一棵二叉排序树。�
(5)同理可以得出,由中序序列和后序序还原二叉树的规则也成立。�
(6)在还原过程中,读入序列的顺序也遵循也先根结点,后子树的规律。�
3总结�
在二叉树的一些应用中,如平衡二叉树、红黑树等,常常要观察二叉树的形态,对其进行判断并调整。根据遍历序列和二叉排序树的性质快速还原出二叉树对于研究相关的问题有很大的帮助。
上面说的是二叉树,树只有先根和后根,没有中序,森林只要先序中序,没有后序
1) 先序遍历:
先访问根结点,再先序遍历左子树,最后再先序遍历右子树。
2) 中序遍历:
先中序遍历左子树,然后再访问根结点,最后再中序遍历右子树。
3) 后序遍历:
先后序遍历左子树,然后再后序遍历右子树,最后再访问根结点。
绛旓細瑙i鎬濊矾锛氾紙1锛夊墠搴忛亶鍘嗙涓涓妭鐐逛负鏍硅妭鐐锛2锛変腑搴忛亶鍘嗙壒鎬т腑闂翠负鏍癸紝宸︿晶涓哄乏瀛愭爲锛屽彸渚т负鍙冲瓙鏍戯紙3锛夊悗搴忛亶鍘嗘渶鍚庝竴涓妭鐐逛负鏍硅妭鐐 瑙o細绗竴姝ワ細鏍规嵁鍓嶅簭閬嶅巻绗竴涓妭鐐逛负鏍硅妭鐐瑰緱鐭ワ紝A涓烘牴 绗簩姝ワ細鏍规嵁涓簭DBEAC寰楃煡锛孉鍓嶉潰鐨勬槸宸﹀瓙鏍戯紝璇存槑 DBE鍦 A宸︿晶锛孋鍦ㄥ彸渚э紝鐩墠鍙互寰楀嚭AC鐨勪綅缃...
绛旓細浜屽弶鏍戝墠搴忎腑搴忓悗搴忓彛璇锛鍓嶅簭閬嶅巻:鏍硅妭鐐光-宸﹀瓙鏍戔-鍙冲瓙鏍锛屼腑搴忛亶鍘:宸﹀瓙鏍戔-鏍硅妭鐐光-鍙冲瓙鏍戯紝鍚庡簭閬嶅巻:宸﹀瓙鏍戔-鍙冲瓙鏍戔-鏍硅妭鐐 鍏堝簭锛氭槸浜屽弶鏍戦亶鍘嗕腑鐨勪竴绉嶏紝鍗冲厛璁块棶鏍圭粨鐐癸紝鐒跺悗閬嶅巻宸﹀瓙鏍戯紝鍚庨亶鍘嗗彸瀛愭爲銆傞亶鍘嗗乏銆佸彸瀛愭爲鏃讹紝鍏堣闂牴缁撶偣锛屽悗閬嶅巻宸﹀瓙鏍戯紝鍚庨亶鍘嗗彸瀛愭爲锛屽鏋滀簩鍙夋爲...
绛旓細1銆佸厛鏍归亶鍘嗕竴鑸槸鍏堝簭閬嶅巻(Pre-order)锛屾寜鐓ф牴宸﹀彸鐨勯『搴忔部涓瀹氳矾寰勭粡杩囪矾寰勪笂鎵鏈夌殑缁撶偣銆傚湪浜屽弶鏍戜腑锛屽厛鏍瑰悗宸﹀啀鍙炽傚阀璁帮細鏍瑰乏鍙炽傞鍏堣闂牴缁撶偣鐒跺悗閬嶅巻宸﹀瓙鏍戯紝鏈鍚庨亶鍘嗗彸瀛愭爲銆傚湪閬嶅巻宸︺佸彸瀛愭爲鏃讹紝浠嶇劧鍏堣闂牴缁撶偣锛岀劧鍚庨亶鍘嗗乏瀛愭爲锛屾渶鍚庨亶鍘嗗彸瀛愭爲锛屽鏋滀簩鍙夋爲涓虹┖鍒欒繑鍥炪備緥濡傦紝涓嬪浘鎵绀轰簩...
绛旓細1銆佸厛搴忛亶鍘嗕篃鍙仛鍏堟牴閬嶅巻銆佸墠搴忛亶鍘嗭紝鍙鍋氭牴宸﹀彸锛堜簩鍙夋爲鐖剁粨鐐瑰悜涓嬪厛宸﹀悗鍙筹級銆傞鍏堣闂牴缁撶偣鐒跺悗閬嶅巻宸﹀瓙鏍戯紝鏈鍚庨亶鍘嗗彸瀛愭爲銆傚湪閬嶅巻宸︺佸彸瀛愭爲鏃讹紝浠嶇劧鍏堣闂牴缁撶偣锛岀劧鍚庨亶鍘嗗乏瀛愭爲锛屾渶鍚庨亶鍘嗗彸瀛愭爲锛屽鏋滀簩鍙夋爲涓虹┖鍒欒繑鍥炪備緥濡傦紝涓嬪浘鎵绀轰簩鍙夋爲鐨勯亶鍘嗙粨鏋滄槸锛欰BDECF 2銆佸悗搴忛亶鍘嗛鍏堥亶鍘嗗乏瀛...
绛旓細宸茬煡涓妫典簩鍙夋爲鍓嶅簭閬嶅巻鍜屼腑搴忛亶鍘嗗垎鍒负ABDEGCFH鍜孌BGEACHF锛屽垯璇ヤ簩鍙夋爲鐨鍚庡簭閬嶅巻鏄疍GEBHFCA銆傚墠搴忛亶鍘嗙殑绗竴涓妭鐐逛负鏍硅妭鐐癸紝鐢卞墠搴忛亶鍘嗗彲鐭ワ紝A涓烘牴鑺傜偣銆備腑搴忛亶鍘嗙殑鏍硅妭鐐瑰墠闈㈢殑鑺傜偣鍧囦负宸﹀瓙鏍戠殑鑺傜偣锛屾墍浠ュ乏瀛愭爲涓婄殑鑺傜偣涓篋BGE銆傚幓鎺夋牴鑺傜偣鍜屽乏瀛愭爲鑺傜偣锛屽彸瀛愭暟鑺傜偣涓篊HF銆傚墠搴忛亶鍘嗙殑绗簩涓...
绛旓細1銆佹牴鎹悗搴忛亶鍘嗙殑鐗圭偣锛屾垜浠煡閬撳悗搴忛亶鍘嗘渶鍚庝竴涓粨鐐瑰嵆涓烘牴缁撶偣锛屽嵆鏍圭粨鐐逛负G銆2銆佽瀵熶腑搴忛亶鍘咥DEFGHMZ銆傚叾涓璻oot鑺傜偣G宸︿晶鐨凙DEF蹇呯劧鏄痳0ot鐨勫乏瀛愭爲锛孏鍙充晶鐨凥MZ蹇呯劧鏄痳oot鐨勫彸瀛愭爲銆3銆佽瀵熷乏瀛愭爲ADEF锛屽乏瀛愭爲鐨勪腑鐨勬牴鑺傜偣蹇呯劧鏄ぇ鏍戠殑root鐨刲eftchild銆傚湪鍓嶅簭閬嶅巻涓紝澶ф爲鐨剅ot鐨刲efichild...
绛旓細鍒欒浜屽弶鏍戠殑鍓嶅簭閬嶅巻搴忓垪涓篈BDECF锛屼腑搴忛亶鍘嗗簭鍒椾负DBEAFC锛鍚庡簭閬嶅巻搴忓垪涓篋EBFCA銆傚厛搴忛亶鍘嗕簩鍙夋爲瑙勫垯锛氭牴-宸-鍙 1銆佽闂牴缁撶偣锛2銆佸厛搴忛亶鍘嗗乏瀛愭爲锛3銆佸厛搴忛亶鍘嗗彸瀛愭爲銆備腑搴忛亶鍘嗕簩鍙夋爲瑙勫垯锛氬乏-鏍-鍙 1銆佸厛涓簭閬嶅巻宸﹀瓙鏍戯紱2銆佸啀璁块棶鏍硅妭鐐癸紱3銆佹渶鍚庤闂腑搴忛亶鍘嗗彸瀛愭爲銆傚悗搴忛亶鍘嗕簩鍙夋爲瑙勫垯...
绛旓細鏍戠殑閬嶅巻鐨勪笁绉嶆儏鍐碉紝鏄牴鎹乏瀛愭爲銆佸彸瀛愭爲銆佹牴杩3鑰呯殑涓嶅悓璁块棶娆″簭鏉ュ畾涔夌殑銆傛牴宸﹀彸锛堟牴鍏堣闂級锛屽垯涓哄厛搴忛亶鍘嗭紱宸︽牴鍙筹紝鍒欎负涓簭閬嶅巻锛涘乏鍙虫牴锛鍒欎负鍚庡簭閬嶅巻銆備妇渚嬪涓:鍓嶅簭閬嶅巻缁撴灉涓:ABC涓簭閬嶅巻缁撴灉涓:BAC鍚庣画閬嶅巻缁撴灉涓:BCA
绛旓細涓簭閬嶅巻锛堜腑鏍归亶鍘嗭級锛氬厛璁块棶宸﹀瓙鏍戯紝鐒跺悗璁块棶鏍硅妭鐐癸紝鏈鍚庤闂彸瀛愭爲銆備緥濡傦紝瀵逛簬浜屽弶鏍1涓2涓3涓4涓5锛屼腑搴忛亶鍘嗙殑缁撴灉涓2涓1涓4涓3涓5銆傚彲浠ユ兂璞℃垚鎸夋爲鐢诲ソ鐨勫乏鍙充綅缃姇褰变笅鏉ャ鍚庡簭閬嶅巻锛氬厛璁块棶宸﹀瓙鏍戯紝鐒跺悗璁块棶鍙冲瓙鏍戯紝鏈鍚庤闂牴鑺傜偣銆備緥濡傦紝瀵逛簬浜屽弶鏍1涓2涓3涓4涓5锛屽悗搴忛亶鍘嗙殑缁撴灉涓4...
绛旓細涓簭閬嶅巻锛氬浜庝竴涓簩鍙夋爲锛屽厛閫掑綊鍦版寜鐓т腑搴忛亶鍘嗙殑鏂瑰紡璁块棶宸﹀瓙鏍戯紝鐒跺悗璁块棶鏍硅妭鐐癸紝鏈鍚庨掑綊鍦版寜鐓т腑搴忛亶鍘嗙殑鏂瑰紡璁块棶鍙冲瓙鏍戙鍚庡簭閬嶅巻锛氬浜庝竴涓簩鍙夋爲锛屽厛閫掑綊鍦版寜鐓у悗搴忛亶鍘嗙殑鏂瑰紡璁块棶宸﹀瓙鏍戝拰鍙冲瓙鏍戯紝鐒跺悗璁块棶鏍硅妭鐐广傝繖涓夌閬嶅巻鏂瑰紡閮藉彲浠ョ敤鏉ユ弿杩颁竴涓簩鍙夋爲鐨勭粨鏋勩傚湪瀹為檯搴旂敤涓紝甯稿父闇瑕佹牴鎹簩鍙...