已知樹的中序序列和先序/後序序列,求樹的結構?
這類問題比較經典了,剛好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...