标签:
题目:已知先序和中序的数组,求输出后序输出结果。思路:根据先序和中序去建一棵二叉树然后后序遍历二叉树
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; struct node { int value; struct node* left; struct node* right; node(int _val) :value(_val){ left = NULL; right = NULL; } }; node* helper(vector<int>& preorder, int i, int j, vector<int>& inorder, int ii, int jj) { // tree 8 4 5 3 7 3 // preorder 8 [4 3 3 7] [5] // inorder [3 3 4 7] 8 [5] // 每次从 preorder 头部取一个值 mid,作为树的根节点 // 检查 mid 在 inorder 中 的位置,则 mid 前面部分将作为 树的左子树,右部分作为树的右子树 if (i >= j || ii >= j) return NULL; int mid = preorder[i]; auto f = find(inorder.begin() + ii, inorder.begin() + jj, mid); int dis = f - inorder.begin() - ii; node* root = new node(mid); root->left = helper(preorder, i + 1, i + 1 + dis, inorder, ii, ii + dis); root->right = helper(preorder, i + 1 + dis, j, inorder, ii + dis + 1, jj); return root; } node* buildTree(vector<int>& preorder, vector<int>& inorder) { return helper(preorder, 0, preorder.size(), inorder, 0, inorder.size()); } void postrecursive(node *root) { if (!root)return; if (root->left != NULL)postrecursive(root->left); if (root->right != NULL)postrecursive(root->right); cout << root->value << " "; } int main() { int a[7] = {1,2,4,5,3,6,7}; int b[7] = {4,2,5,1,3,7,6}; vector<int>pre(a,a+7); vector<int>mid(b,b+7); node *root = buildTree(pre,mid); postrecursive(root); cin.get(); return 0; }
标签:
原文地址:http://www.cnblogs.com/mahaitao/p/5850048.html