演算法原題來自:hihocoder
題目要求使用樹的前序遍歷和中序遍歷求出樹的後序遍歷串。那麼我們想到的方法便是根據前序遍歷和中序遍歷求出這棵樹,那麼就可以很容易的後序遍歷此樹了。
根據題目我們先來定義樹節點的資料結構:
typedef struct nodenode_t;
那麼我們可以這樣設定這個函式:
//str1 為前序遍歷串, str2 為中序遍歷串 返回這棵樹的根
node_t* tree(const char *str1,const char *str2)
我們可以根據樹的定義:
前序遍歷=root + 左子樹前序遍歷 + 右子樹前序遍歷
中序遍歷=左子樹中序遍歷 + root + 右子樹中序遍歷
可以知道樹的根節點root就是字串的第乙個字元str1[0], 而根據這個根節點我們可以從str2中找到這個root節點,那麼str2中在root節點左邊的字串str2l就是這棵樹的左子樹中序遍歷結果,而這個左子樹的節點個數(即str2l字串長度)n就可以得到了,從而在str1中可以取得左子樹的前序遍歷遍歷結果:即str[1]到str[1+n]這個便是左子樹的前序遍歷結果。
得到了左子樹的前序遍歷和左子樹的中序遍歷,那麼我們又可以很開心的使用我們tree()函式了,這就返回的是左子樹,連線到我們node->left就完成了左子樹的構造。右子樹使用相同的方法就可以得到一棵完整的樹。那麼接下就後序遍歷這棵樹列印答案吧,enjoy it。
完整**:
#include #include #include typedef struct nodenode_t;
node_t* tree(const char *str1,const char *str2)
void ans(node_t *node)
int main()
題解 求後序遍歷(二叉樹遍歷,遞迴)
題目描述 給出二叉樹的先序遍歷和中序遍歷,求後序遍歷。輸入 輸入共兩行,第一行乙個字串,表示樹的先序遍歷,第二行乙個字串,表示樹的中序遍歷。樹的結點一律用小寫字母表示。字串長度小於100 10010 0。輸出 輸出僅一行,表示樹的後序遍歷序列。樣例輸入 abdec dbeac 樣例輸出 debca二...
二叉樹後序遍歷演算法實現
對於二叉樹的三種遍歷方式,它們的難易程度是不一樣的,最簡單的是先序遍歷,其次是中序遍歷,最難的是後序遍歷方式。但是最難的後序遍歷方式,卻可以通過最簡單的先序遍歷方式的變形實現,然後把遍歷的結果逆序一下就搞定了。哈哈,物極必反啊!先看乙個最簡單的後序的遍歷方法的實現,利用先序遍歷方式的變形,然後逆序 ...
2016 11 3 1003 二叉樹後序遍歷
思路 根據二叉樹的前序和中序得到後序,只需要在中序中找到與前序第乙個相同的節點值,即根節點,然後把它分為左右子樹遞迴即可。左子樹遞迴時前序遍歷需要去掉第乙個,右子樹遞迴時則兩個序列都要去掉根節點及其左邊的內容。include include include using namespace std s...