输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
#include "vector" #include "iostream" using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) { int length = preorder.size(); if (length == 0) return nullptr; int rootValue = preorder[0]; TreeNode *node = new TreeNode(rootValue); int lfEnd; for (lfEnd = 0; inorder[lfEnd] != rootValue; ++lfEnd); if (lfEnd == 0) node->left = nullptr; else { vector<int> prelf(preorder.begin() + 1, preorder.begin() + 1 + lfEnd); vector<int> inlf(inorder.begin(), inorder.begin() + lfEnd); node->left = buildTree(prelf, inlf); } if (length - 1 == lfEnd) node->right = nullptr; else { vector<int> prerg(preorder.begin() + lfEnd + 1, preorder.end()); vector<int> inrg(inorder.begin() + lfEnd + 1, inorder.end()); node->right = buildTree(prerg, inrg); } return node; } }; int main() { Solution s; vector<int> pre{3, 9, 20, 15, 7}; vector<int> in{9, 3, 15, 20, 7}; s.buildTree(pre, in); }
原文:https://www.cnblogs.com/zhangzhangtabszj/p/14747230.html