剑指offer 面试题6:重建二叉树 题解

剑指offer 重建二叉树

提交网址:  http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157
或 leetcode 105:  https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

参与人数:5246  时间限制:1秒  空间限制:32768K

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


分析:

剑指offer 面试题6:重建二叉树 题解_第1张图片


如图所示,先在中序中找到根节点的位置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;
}
*/






你可能感兴趣的:(LeetCode,数据结构与算法,解题报告,剑指offer)