已知樹的中序序列和先序 後序序列,求樹的結構?

2021-04-14 00:37:41 字數 1298 閱讀 1264

已知樹的中序序列和先序/後序序列,求樹的結構?

這類問題比較經典了,剛好csdn上有人問起,所以自己寫了乙個遞迴演算法,根據中序和先序(後序)建立樹結構。這裡需要說明的是:必須要知道中序序列,先序和後序可選的情況下才能推導出樹結構,只知道後序先序是推導不出。簡單說明一下基本思路,例:

已知後序: debgfca  中序:dbeafgc 求先序?或者求樹結構?

因為有後序序列debgfca,所以根節點為a,再根據中序序列,dbe|a|fgc,所以dbe肯定是左子樹,fgc是右子樹;再看左子樹dbe,因為後序序列deb,所以可以確定根節點為b,所以中序序列d|b|e可以分成d和e兩個左子樹,以此類推,這樣就形成了乙個遞迴過程。根據這個推斷就很容易把樹構造出來:

#include

using namespace std;

typedef struct _bitreenode

char _data;

_bitreenode* _leftchild;

_bitreenode* _rightchild;

}btreenode, *pbtreenode;

enum ebtreetype ;

//找出字元相同(排列次序不同)

string iscontain(string strdes, string strsrc)

char ch;

if (ebtt == bttpreorder)            //先序

else if (ebtt == bttlastorder)    //後序

proot->_data = ch;

proot->_leftchild = new btreenode;

proot->_rightchild = new btreenode;

//左子樹

int ipos = strmid.find(ch);

if (ipos == string::npos) return false;

strtmp = strmid.substr(0, ipos);

string str = iscontain(strsec, strtmp);

if (!str.empty())

//右子樹

strtmp = strmid.substr(ipos+1, strmid.length()-1-ipos);

str = iscontain(strsec, strtmp);

if (!str.empty())

return true;

}int main()

system("pause");

}

已知先序中序序列求後序序列

way 1.由先序和中序遍歷序列確定一棵二叉樹,再後序遍歷得到後序序列。如何確定呢?1.根據先序遍歷的第乙個結點確定根節點 2.根據根節點在中序遍歷序列的位置分割出左右兩個子串行,即根節點的左右子樹 3.對左右子樹按此方法遞迴進行分解。定義二叉樹的資料結構 typedef struct treeno...

已知後序中序序列求先序序列

方法呢,與前一篇一樣,建樹或者不建樹皆可,這裡不做過多說明,直接show code。way 1.typedef struct treenode bintree struct treenode bintree buildtree char post,char in,int n way 2.const ...

已知中序和後序求先序

include include using namespace std struct tnode define len sizeof tnode typedef tnode pbtnodepoint void vcreate string sinorder,string spostorder,pbt...