1. 程式人生 > >劍指offer:重建二叉樹(C++)

劍指offer:重建二叉樹(C++)

題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
程式碼:

#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
/**
* Definition for binary tree
* struct TreeNode {
*     int val;
*     TreeNode *left;
*     TreeNode *right;
*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> vin) { if (pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size()){ return
NULL; } TreeNode * ptn = create(pre, vin); return ptn; } TreeNode* create(vector<int> pre, vector<int> vin){ if (pre.size() == 0 || vin.size() == 0 || pre.size() != vin.size()){ return NULL; } else{ TreeNode * ptn = new TreeNode(pre[0]); int leftNum = 0; int rightNum =
0; int rootMid = rootIndex(pre[0], vin, leftNum, rightNum); vector<int> preLeft(pre.begin() + 1, pre.begin() + leftNum + 1); vector<int> preRight(pre.begin() + leftNum + 1, pre.end()); vector<int> vinLeft(vin.begin(), vin.begin() + rootMid); vector<int> vinRight(vin.begin() + rootMid + 1, vin.end()); ptn->left = create(preLeft, vinLeft); ptn->right = create(preRight, vinRight); return ptn; } } int rootIndex(int element, vector<int> v, int &leftNum, int &rightNum){ int rootIndex = -1; for (int i = 0; i < v.size(); i++){ if (element == v[i]){ rootIndex = i; continue; } if (rootIndex == -1){ leftNum++; } else{ rightNum++; } } return rootIndex; } }; //前序遍歷 void firstRoot(TreeNode* phead){ if (phead != NULL){ cout << phead->val << " "; firstRoot(phead->left); firstRoot(phead->right); } } //中序遍歷 void midRoot(TreeNode* phead){ if (phead != NULL){ midRoot(phead->left); cout << phead->val << " "; midRoot(phead->right); } } int main(void) { //前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} vector<int> pre = { 1, 2, 4, 7, 3, 5, 6, 8 }; vector<int> vin = { 4, 7, 2, 1, 5, 3, 8, 6 }; Solution s; TreeNode* p = s.reConstructBinaryTree(pre,vin); firstRoot(p); cout << endl; midRoot(p); return 0; }