根据二叉树前序中序输出后序和根据二叉树后序中序生成前序
来源:互联网 发布:手机淘宝阿里旺旺在哪 编辑:程序博客网 时间: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
- 根据二叉树前序中序输出后序和根据二叉树后序中序生成前序
- 根据前序和后序构建二叉树
- HDU1710(根据前序和中序生成二叉树)
- 根据二叉树先序中序序列输出后序
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- 剑指Offer-根据二叉树的前序和后序遍历重建二叉树
- [剑指offer] 重建二叉树,根据前中,输出后,根据中后,输出前
- 根据前序遍历、中序遍历构建二叉树,并后序遍历输出。
- 根据前序与后序遍历构建二叉树,并以后序遍历结果输出
- 根据前序 中序 后序 构建二叉树
- offer面试题---根据前序遍历和中序遍历的顺序输出二叉树
- 根据二叉树的前序和中序获得后序,后序和中序获得前序
- 根据中序序列和前序序列,求二叉树的后序序列
- 根据二叉树的前序序列和中序序列得到后序序列
- C++根据前序遍历和后序遍历建二叉树
- 二叉树系列——根据前序和中序、中序和后序构建二叉树
- 二叉树序列---根据后序和中序系列或前序和中序序列构造二叉树
- 重构二叉树(根据前序和中序)
- 新东方教育
- gnome 3 的几个桌面扩展
- 不要在构造函数和析构函数中调用虚函数
- 程序的内存布局——函数调用栈的那点事
- NoSQL数据库笔谈
- 根据二叉树前序中序输出后序和根据二叉树后序中序生成前序
- Android实战技巧之三十二:Android Studio中的源代码管理
- python+selenium配置
- 关于storm的好文章帖子
- Get data from file(scripts/main.lua) failed!
- 个人作业
- 三大存储方式之一:SharedPreferences 存储
- 你不知道的JavaScript(四)数值
- 如何生成矢量图