根据树的先序和中序来创建一棵树
只知道先序序列和后序序列是无法求出唯一的树,所以不做讨论。
- #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;
- }