在一棵二叉樹總,前序遍歷結果為: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()
已知前序和中序遍歷,重建二叉樹
想在牛客網上寫此題目,此處 題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 前序遍歷 根節點 左子樹 右子樹 中序遍歷 左子樹 根節點 右子樹 後序遍歷 左子樹 右...
已知二叉樹的前序和中序,重建二叉樹 筆記
題目如下 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 二叉樹的前序遍歷順序是 先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。中序遍歷順序是 中序遍歷根節點的左子樹,...
已知前序 中序 求二叉樹
題目如下 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。分析 二叉樹的前序遍歷順序是 先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。中序遍歷順序是 中序遍歷根節點的左子樹,...