1. 程式人生 > 實用技巧 >LeetCode 105. 從前序遍歷與中序遍歷序列構造二叉樹

LeetCode 105. 從前序遍歷與中序遍歷序列構造二叉樹

題目描述連結:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

解題思路:遞迴法。前序遍歷 根 左子樹 右子樹 中序遍歷為 左子樹 根 右子樹

由此我們根據前序序列獲得根,然後在中序序列中定位根的位置,便可得到根的左子樹

與右子樹序列之後對於左子樹與右子樹遞迴的進行此操作。最終實現解題。

LeetCode C++求解程式碼如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 
*/ class Solution { public: unordered_map<int,int>index; TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { for(int i=0;i<inorder.size();++i){ index[inorder[i]]=i; } return fun(preorder,inorder,0,preorder.size()-1,0
,inorder.size()-1); } TreeNode* fun(vector<int>& preorder,vector<int>& inorder,int pre_left,int pre_right,int in_left,int in_right){ if(pre_left>pre_right){ return NULL; } int tree_root=preorder[pre_left];//
樹根 int temp=index[tree_root];//中序中樹根位置 TreeNode *root=new TreeNode(tree_root); int size=temp-in_left; root->left=fun(preorder,inorder,pre_left+1,pre_left+size,in_left,temp-1); root->right=fun(preorder,inorder,pre_left+size+1,pre_right,temp+1,in_right); return root; } };