根据二叉树前序中序输出后序和根据二叉树后序中序生成前序

来源:互联网 发布:手机淘宝阿里旺旺在哪 编辑:程序博客网 时间:2024/06/07 03:55
#include <iostream>  #include <cstring>  #define MAX 50 using namespace std;typedef char Element;typedef struct _stBinaryTree{Element data;//数据  struct _stBinaryTree *Lchild;//左孩子  struct _stBinaryTree *Rchild;//右孩子  }stBinaryTree;  //查找某一元素在中序输出结果中的索引  int indexIn_inOrder(Element num, Element *array, int len);   //根据前序中序结果生成二叉树stBinaryTree * makeTree_accordPreInOrder(Element *pre, Element *center, int len); //根据后序中序结果生成二叉树stBinaryTree * makeTree_accordPostInOrder(Element *post, Element *center, int len); //后序遍历输出void postOrderTravesal(stBinaryTree * root); //前序遍历输出void preOrderTravesal(stBinaryTree * root); //销毁二叉树void destroyTree(stBinaryTree * root); int main(void){//根据前序中序结果生成二叉树,后序输出cout << "input preorder & inorder traversal data:\n";Element *preorder = new Element[MAX];//后序数组  Element *inorder = new Element[MAX];//中序前序数组  cin >> preorder;    //先输入前序cin >> inorder;        //再输入中序stBinaryTree * root1 = makeTree_accordPreInOrder(preorder, inorder, strlen(inorder));//由于本例结构元素为char,所以可以用strlen来获元素个数,其他情况可机变postOrderTravesal(root1);cout << endl;//释放内存delete[] preorder;delete[] inorder;destroyTree(root1); //根据后序中序结果生成二叉树,前序输出cout << "input postorder & inorder traversal data:\n";Element *postorder = new Element[MAX];//后序数组  Element *inorder2 = new Element[MAX];//中序数组  cin >> postorder;    //先输入后序cin >> inorder2;        //再输入中序stBinaryTree * root2 = makeTree_accordPostInOrder(postorder, inorder2, strlen(inorder2));//由于本例结构元素为char,所以可以用strlen来获元素个数,其他情况可机变preOrderTravesal(root2);cout << endl;//释放内存delete[] postorder;delete[] inorder2;destroyTree(root2);return 0;} //查找某元素在中序结果中的索引int indexIn_inOrder(Element num, Element *array, int len){for (int i = 0; i<len; i++)if (array[i] == num)return i;return -1;//没有找到  }                  //根据前序中序结果生成二叉树stBinaryTree * makeTree_accordPreInOrder(Element *pre, Element *center, int len){if (len <= 0)return NULL;stBinaryTree *temp = new stBinaryTree;temp->data = pre[0];//前序第一个元素即为根元素int index = indexIn_inOrder(temp->data, center, len);//遍历左孩子 (前序结果中,从第1个元素开始到第index个元素都是左子树(从0计数))if (index != -1){ temp->Lchild = makeTree_accordPreInOrder(pre + 1, center, index);//遍历右孩子 (前序结果中,从第index+1个元素开始到第Len-1个元素都是右子树(从0计数)) temp->Rchild = makeTree_accordPreInOrder(pre + index + 1, center + index + 1, len - index - 1);return temp;}else{cout << " Element '" << temp->data << "' is not found in inorder result!\n";return NULL;}} //根据后序中序结果生成二叉树stBinaryTree * makeTree_accordPostInOrder(Element *post, Element *center, int len){if (len <= 0)return NULL;stBinaryTree *temp = new stBinaryTree;temp->data = post[len - 1];//后序最后一个元素即为根元素int index = indexIn_inOrder(temp->data, center, len);//遍历左孩子 (后序结果中,从第0个元素开始到第index-1个元素都是左子树)if (index != -1){temp->Lchild = makeTree_accordPostInOrder(post, center, index);//遍历右孩子 (后序结果中,从第index个元素开始到第Len-2个元素都是右子树(从0计数)) temp->Rchild = makeTree_accordPostInOrder(post + index, center + index + 1, len - index - 1);return temp;}else{cout << " Element '" << temp->data << "' is not found in inorder result!\n";return NULL;}}  //后序遍历输出void postOrderTravesal(stBinaryTree * root){if (root != NULL){postOrderTravesal(root->Lchild);postOrderTravesal(root->Rchild);cout << root->data;}}  //前序遍历输出void preOrderTravesal(stBinaryTree * root){if (root != NULL){cout << root->data;preOrderTravesal(root->Lchild);preOrderTravesal(root->Rchild);}} //销毁二叉树void destroyTree(stBinaryTree * root){if (root){stBinaryTree* tmpLeft = NULL, *tmpRight = NULL;if (root->Lchild)tmpLeft = root->Lchild;if (root->Rchild)tmpRight = root->Rchild;delete root;destroyTree(tmpLeft);destroyTree(tmpRight);}}
0 0
原创粉丝点击