已知前序和中序求後序與已知中序和後序求前序的演算法

2021-07-08 13:26:02 字數 1497 閱讀 2237

這個問題在面試中很常見,本人就碰到過一次,已經吃過一次虧了。。。。

/**程式說明:已知二叉樹的前序序列和中序序列,寫乙個演算法獲取其後序序列;已知二叉樹的中序和後序序列,求前序序列

*程式思路: 這是乙個遞迴的過程,先從前序中找根節點,然後通過中序中進行判斷,如果在左,那麼第二個結點就是左結點,

如果在右,那麼就是右節點,已知中序和後序求前序是一樣的道理。

*/#include using namespace std;

typedef struct node

tnode;

//已知前序和中序,求後序

node* getpostorder(char *pre,char *in,int length)

tnode *newnode = new node;//建立乙個新的結點,用於盛放根節點

newnode->elem = *pre;//根節點為先序的第乙個結點

int rootindex = 0;//此變數記錄根節點所在位置的索引

//在中序中遍歷找到前序中的根節點

for(;rootindex < length;++rootindex)

} //開始遞迴找左子樹

newnode->lchild = getpostorder(pre+1,in,rootindex);

//開始遞迴找右子樹

newnode->rchild = getpostorder(pre+rootindex+1,in+rootindex+1,length-(rootindex+1));

coutreturn newnode;

}//已知中序和後序,求前序

node* getpreorder(char *in,char* post,int length)

tnode *newnode = new node;//建立乙個新的結點用於盛放根節點

newnode->elem = *(post + length - 1);//根節點是後序的最後乙個節點

int rootindex = 0;//此變數用於記錄根節點所在位置的索引

//在中序中遍歷找到後序中的根節點

for(;rootindex < length;++rootindex)

} //cout<<"rootindex = "//然後開始遞迴找其左子樹和右子樹

newnode->lchild = getpreorder(in,post,rootindex);

newnode->rchild = getpreorder(in + rootindex + 1,post + rootindex,length - rootindex - 1);

return newnode;

}int main(int argc, char *argv)

{ char *pre = "gdafemhz";

char *in = "adefghmz";

char *post = "aefdhzmg";

getpostorder(pre,in,8);

cout<

已知前序中序,求後序

思路 先序的遍歷規則為根 左 右,中序的遍歷規則為左 根 右,所以我們在中序中找到與a a必為根 相等的字元,則在中序中g d h b為a的左子樹,e i c j f為a的右子樹,在左子樹和右子樹中,重複前面過程,最後逆向將根列印出來,就是其後序。是乙個遞迴過程 include include us...

已知後序與中序輸出前序

已知後序與中序輸出前序 先序 後序 3,4,2,6,5,1 左右根 中序 3,2,4,1,6,5 左根右 分析 通過遞迴實現。因為後序的最後乙個總是根結點,在中序通過該根結點確定左右子樹,並通過start和end分別標出後序與中序左右子樹範圍。最後對左子樹與右子樹使用同樣的方法。實現 如下 incl...

已知前序(先序)與中序輸出後序

已知前序 先序 與中序輸出後序 前序 1,2,3,4,5,6 根左右 中序 3,2,4,1,6,5 左根右 分析 因為前序 根左右 最先出現的總是根結點,所以令root為前序中當前的根結點下標 並且同時把一棵樹分為左子樹和右子樹 start為當前需要列印的子樹在中序中的最左邊的下標,end為當前需要...