這個問題在面試中很常見,本人就碰到過一次,已經吃過一次虧了。。。。
/**程式說明:已知二叉樹的前序序列和中序序列,寫乙個演算法獲取其後序序列;已知二叉樹的中序和後序序列,求前序序列
*程式思路: 這是乙個遞迴的過程,先從前序中找根節點,然後通過中序中進行判斷,如果在左,那麼第二個結點就是左結點,
如果在右,那麼就是右節點,已知中序和後序求前序是一樣的道理。
*/#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為當前需要...