LeetCode-重建二叉树(前序遍历+中序遍历)

重建二叉树

LeetCode-105

  • 首次需要知道前序遍历和中序遍历的性质。
  • 解题思路如下:首先使用前序比遍历找到根节点,然后使用中序遍历找到左右子树的范围,再分别对左右子树实施递归重建。
  • 本题的难点就是如何在前序遍历中找到左右子树的范围以分别重构,这可以根据中序遍历中的左右子树的数量来分辨。使用前序遍历的根节点和中序遍历的根节点相同时,表示此时前序遍历的左子树已经找到了。
  • 具体的实施时需要带有4个参数分别控制左右子树的范围。
/**
 * 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
 **/
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
// Definition for a binary tree node.
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
/**
 * [3,9,20,15,7]
 * [9,3,15,20,7]
    3
   / \
  9  20
    /  \
   15   7
**/
class Solution {
private:
    int sum=0;//
    int l,r;
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int length=preorder.size();
        int startpre=0,startin=0,endpre=length-1,endin=length-1;
        return buildTree(preorder,inorder,startpre,endpre,startin,endin);
    }
    //每次根据当前子树的前序以及后序遍历的位置来重建左右子树
    TreeNode* buildTree(vector<int>& preorder,vector<int>& inorder,int startpre,int endpre,int startin,int endin){
        if(startpre>endpre||startin>endin)
            return NULL;
        int discrepancy=0;//表示从中序遍历中找到的分割左右子树的位置
        while(inorder[startin+discrepancy]!=preorder[startpre]){
            discrepancy++;
        }
        TreeNode* node=new TreeNode(preorder[startpre]);
        node->left=buildTree(preorder,inorder,startpre+1,startpre+discrepancy,startin,startin+discrepancy-1);
        node->right=buildTree(preorder,inorder,startpre+discrepancy+1,endpre,startin+discrepancy+1,endin);
        return node;
    }
};
int main(){
    TreeNode* t1=new TreeNode(10);
    TreeNode* t2=new TreeNode(5);
    TreeNode* t3=new TreeNode(15);
    TreeNode* t4=new TreeNode(3);
    TreeNode* t5=new TreeNode(7);
    TreeNode* t6=new TreeNode(18);
    t2->left=t4;t2->right=t5;
    t3->left=t6;
    t1->left=t2;t1->right=t3;
    Solution solution;

    system("pause");
    return 0;
}
posted @ 2020-02-23 21:07  Garrett_Wale  阅读(184)  评论(0编辑  收藏  举报