6 3 3 二叉樹重建 已知前序和中序求後序

2021-06-14 11:11:15 字數 1257 閱讀 1697

在一棵二叉樹總,前序遍歷結果為:dbacegf,中序遍歷結果為 abcdefg,求後序遍歷結果。

我們知道:

前序遍歷方式為:根節點->左子樹->右子樹

中序遍歷方式為:左子樹->根節點->右子樹

後序遍歷方式為:左子樹->右子樹->根節點

從這裡可以看出,前序遍歷的第乙個值就是根節點,然後再中序遍歷中找到這個值,那麼這個值的左邊部分即為當前二叉樹的左子樹部分前序遍歷結果,這個值的右邊部分即為當前二叉樹的右子樹部分前序遍歷結果。因此,通過這個分析,可以恢復這棵二叉樹,得到這樣的一段偽碼:

節點 getroot(前序,中序)

c=前序第乙個字元

pos=c在中序中的位置

len1=中序pos左半部分長度

len2=中序pos右半部分長度

新建節點r,令r的元素等於c

r的左兒子=getroot(前序位置1開始的len1長度部分,中序pos位置的左半部分)

r的右兒子=getroot(前序位置len1開始右半部分,中序pos位置的右半部分)

return r

下面有兩種求法:

1.不建立樹,直接輸出結果

#include#includechar ans[8];

char *s1 = "dbacegf";

char *s2 = "abcdefg";

void build(int n, char *s1, char *s2, char *s)

int main()

2.建立二叉樹

#include #include #include using namespace std;

struct treenode

;treenode* binarytreefromorderings(char* inorder, char* preorder, int length)

node->left = binarytreefromorderings(inorder, preorder +1, rootindex);

node->right = binarytreefromorderings(inorder + rootindex + 1, preorder + rootindex + 1, length - (rootindex + 1));

cout << node->elem << " ";

return node;

}int main()

已知前序和中序遍歷,重建二叉樹

想在牛客網上寫此題目,此處 題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 前序遍歷 根節點 左子樹 右子樹 中序遍歷 左子樹 根節點 右子樹 後序遍歷 左子樹 右...

已知二叉樹的前序和中序,重建二叉樹 筆記

題目如下 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 二叉樹的前序遍歷順序是 先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。中序遍歷順序是 中序遍歷根節點的左子樹,...

已知前序 中序 求二叉樹

題目如下 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 二叉樹的前序遍歷順序是 先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。中序遍歷順序是 中序遍歷根節點的左子樹,...