105. 从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题
递归得到每个子节点,返回节点;
注意点
右子树的节点为getnode(preorder,inorder,i+t-start+1,t+1,end);
;
/**
* 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:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode * res=getnode(preorder,inorder,0,0,inorder.size()-1);
return res;
}
private:
TreeNode * getnode(vector<int>& preorder, vector<int>& inorder,int i,int start,int end) //i为前序的根节点 s,e为中序的范围
{
if(start>end) return NULL;
if(start==end) {
TreeNode * tmp=new TreeNode(inorder[start]);
return tmp;
}
int t;
for(t=start;t<=end;t++)
if(inorder[t]==preorder[i])
break;
TreeNode* tmp=new TreeNode(preorder[i]);
tmp->left=getnode(preorder,inorder,i+1,start,t-1);
tmp->right=getnode(preorder,inorder,i+t-start+1,t+1,end);
return tmp;
}
};
106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解题
有后序遍历得到根节点位置,i从大到小即可;
注意点
左子树的节点为getnode(inorder,postorder,i-(end-t)-1,start,t-1);
。
/**
* 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:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
//后序遍历从后往前
TreeNode *res=getnode(inorder,postorder,postorder.size()-1,0,inorder.size()-1);
return res;
}
private:
TreeNode * getnode(vector<int>& inorder, vector<int>& postorder,int i,int start,int end)
{
if(start>end) return NULL;
if(start==end) {
TreeNode* tmp=new TreeNode(inorder[start]);
return tmp;
}
int t;
for(t=start;t<=end;t++)
if(inorder[t]==postorder[i])
break;
TreeNode *r=new TreeNode(postorder[i]);
r->right=getnode(inorder,postorder,i-1,t+1,end);
r->left=getnode(inorder,postorder,i-(end-t)-1,start,t-1);
return r;
}
};