已知中序后序创建二叉树
2014-03-19 20:20
281 查看
#include<iostream.h> #include<string.h> #include<stdlib.h> #include<assert.h> template<class Type> class BinaryTree { public: struct TreeNode { Type data; TreeNode *leftchild, *rightchild; }; BinaryTree() {} ~BinaryTree(){} private: TreeNode *root; static TreeNode *_BuyNode() { TreeNode *p = (TreeNode *)malloc(sizeof(TreeNode)); assert(p != NULL); return p; } static int find(Type *is, const Type &x, int n) { for(int i = 0; i < n; ++i) { if(is[i] == x) return i; } return -1; } static TreeNode *CreatInPost(Type *post, Type *is, int n) { if(post == NULL || is == NULL || n ==0) return NULL; else { TreeNode *s = _BuyNode(); s->data = post[n-1]; int num = find(is, post[n-1], n); if(num == -1) exit(1); s->leftchild = CreatInPost(post, is,num);//此处放进去的是线序遍历的前num个 s->rightchild = CreatInPost(post+num, is+num +1, n-num-1);//此处减1是因为这是从后序遍历中找的每次最后一个数就被使用了,每次到这里就要将它除掉 return s; } } static void PreOrder(TreeNode *root) { if(root != NULL) { cout << root->data << " "; PreOrder(root->leftchild); PreOrder(root->rightchild); } } public: void Creat(Type *post, Type *is, int n) { if(post != NULL && is != NULL) root = CreatInPost(post, is, n); } void PreOrder() { PreOrder(root); cout << endl; } }; int main(void) { BinaryTree<int> tree; int post[] = {34,56,67,45,23,89,78,12}; int is[] = {34,23,56,45,67,12,78,89}; int n = sizeof(post) / sizeof(post[0]); tree.Creat(post, is, n); tree.PreOrder(); return 0; }
相关文章推荐
- 二叉树的先序创建,先序,中序,后序的递归与非递归遍历,层次遍历,叶子结点数及树的深度
- 已知前序是ABCDEFG 中序是CBEDAFG 求二叉树的后序?
- 已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?
- noip2003 加分二叉树 (树形dp+分治法,已知中序,输出前序)
- 二叉树的创建(前序中序创建二叉树、中序后序创建二叉树)
- 已知前序和中序、后序和中序建立二叉树
- 已知二叉树的前序和中序遍历,构建该二叉树
- 已知中序与后序,或者中序与先序,构造二叉树
- 已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出对应的二叉树
- 已知中序和前序序列建二叉树
- 已知二叉树的前序/后序遍历和中序遍历,求后序/前序遍历
- 我强大的二叉树(先序、层序创建,先序、中序、后序、层序遍历)
- java 二叉树/创建/先序/中序/后序
- 二叉树的创建、先序、中序、后序遍历
- 二叉树已知先序&中序求后序
- 已知中序与后序,或者中序与先序,构造二叉树
- 根据前序和中序遍历创建二叉树
- 已知二叉树的先序和中序遍历,求后序遍历及二叉树
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树
- LeetCode 106. 已知中序和后序遍历构建二叉树