剑指offer 重建二叉树
分析:
如图所示,先在中序中找到根节点的位置inRootpos,然后根节点左边递归地生成左子树,根节点右边递归地生成右子树.
其中preRootpos是逐一右移的.
AC代码:
#include <iostream> #include <vector> using namespace std; struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) { if(pre.size() != in.size() || pre.size()==0 || in.size()==0) return NULL; else { TreeNode* inRoot = createTreeHelper(pre,in, 0, 0, in.size()-1); return inRoot; } } TreeNode* createTreeHelper(vector<int> pre,vector<int> in, int preRootpos, int inLeft,int inRight) { // pre:前序,in:中序, preRoot: 前序中的根节点,inLeft:中序中的左边界,inRight:中序中的右边界 int inRootpos, RootVal; RootVal = pre[preRootpos]; // 不建议使用.at()取下标的值 // cout<<preRootpos<<endl; if(inLeft>inRight) return NULL; for(int i=inLeft; i<=inRight; i++) { if(in[i] == RootVal) inRootpos = i; // 找到根节点在中序中的位置inRootpos,for循环中循环完成后增量i无法使用,于是用全局变量存储下来 } int leftLen=inRootpos-inLeft; TreeNode* inRoot = new TreeNode(RootVal); inRoot->left = createTreeHelper(pre,in, preRootpos+1,inLeft,inRootpos-1); inRoot->right = createTreeHelper(pre,in, preRootpos+leftLen+1,inRootpos+1,inRight); //注意这里的下一个根节点的位置 return inRoot; } }; // 以下为测试部分 /* void InTraverse(TreeNode *pRoot) { if(pRoot == NULL) return; InTraverse(pRoot->left); // 遍历左子树 cout<<pRoot->val<<" "; // 访问根节点 InTraverse(pRoot->right); // 遍历右子树 } void PostTraverse(TreeNode *pRoot) { if(pRoot == NULL) return; PostTraverse(pRoot->left); // 后序遍历左子树 PostTraverse(pRoot->right); // 后序遍历右子树 cout<<pRoot->val<<" "; // 访问根节点 } int main() { int arrA[7] = {1,2,3,4,5,6,7}; int arrB[7] = {3,2,4,1,6,5,7}; vector<int> a(arrA,arrA+7); vector<int> b(arrB,arrB+7); Solution sol; TreeNode *root; root = sol.reConstructBinaryTree(a,b); // PostTraverse(root); InTraverse(root); return 0; } */