演算法求二叉樹後序遍歷

2021-06-28 03:53:45 字數 973 閱讀 2522

演算法原題來自: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...