根據樹的兩種遍歷序列求第三種遍歷序列
阿新 • • 發佈:2019-02-08
只知道先序序列和後序序列是無法求出唯一的樹,所以不做討論。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; struct BinaryTreeNode { char c; BinaryTreeNode *lchild, *rchild; BinaryTreeNode() { lchild = NULL, rchild = NULL; } }; struct BinaryTreeNode *root1,*root2; char preorder[100], inorder[100], postorder[100]; void preSearch(BinaryTreeNode *root) //先序遍歷樹 { if(root != NULL) { printf("%c", root->c); preSearch(root->lchild); preSearch(root->rchild); } return ; } void midSearch(BinaryTreeNode *root) //中序遍歷樹 { if(root != NULL) { midSearch(root->lchild); printf("%c", root->c); midSearch(root->rchild); } return ; } void postSearch(BinaryTreeNode *root) //後序遍歷樹 { if(root != NULL) { postSearch(root->lchild); postSearch(root->rchild); printf("%c", root->c); } return ; } void BuildTreeFromPreAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根據中序和先序求樹 { root = new BinaryTreeNode(); root->c = *(preorder + now); int pos = (int)(strchr(inorder, *(preorder + now)) - inorder); //查詢字串中首次出現某個字元的位置 now++; if(now >= len) return ; if(pos - 1 >= ll) { BinaryTreeNode *t = new BinaryTreeNode(); root->lchild = t; BuildTreeFromPreAndMid(root->lchild, ll, pos - 1, len, now); } if(pos + 1 <= lr) { BinaryTreeNode *t = new BinaryTreeNode(); root->rchild = t; BuildTreeFromPreAndMid(root->rchild, pos + 1, lr, len, now); } } void BuildTreeFromPostAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根據中序和後序求樹 { root = new BinaryTreeNode(); root->c = *(postorder + now); int pos = (int)(strchr(inorder, *(postorder + now)) - inorder); now--; if(now < 0) return ; if(pos + 1 <= lr) { BinaryTreeNode *t = new BinaryTreeNode(); root->rchild = t; BuildTreeFromPostAndMid(root->rchild, pos + 1, lr, len, now); } if(pos - 1 >= ll) { BinaryTreeNode *t = new BinaryTreeNode(); root->lchild = t; BuildTreeFromPostAndMid(root->lchild, ll, pos - 1, len, now); } } //釋放二叉樹 inline void DeleteBinaryTree(BinaryTreeNode * &root) { if(root) { DeleteBinaryTree(root->lchild); //釋放左子樹 DeleteBinaryTree(root->rchild); //釋放右子樹 delete root; //釋放根結點 } } int main(void) { gets(preorder); gets(inorder); //gets(postorder); int now = 0; BuildTreeFromPreAndMid(root1, 0, strlen(preorder) - 1, strlen(preorder), now); //int now2 = strlen(postorder)-1; //BuildTreeFromPostAndMid(root2, 0, strlen(postorder) - 1, strlen(postorder), now2); postSearch(root1); puts(""); DeleteBinaryTree(root1); /*preSearch(root2); puts(""); DeleteBinaryTree(root2);*/ return 0; }