106. 从中序与后序遍历序列构造二叉树
注意:
1. vector的构造函数使用迭代器的时候是左闭右开, [first, last) 。最常见的( s.begin(),s.end())就不包括end(),end()迭代器是空的
2. 使用到的另一个vector的函数是 resize() 。 不能直接vector.size()= n 去改变size大小
3. 有点老糊涂了,函数的声明和调用不一样,traversal(vector<int>& inorder, vector<int>& postorder),调用的时候参数不需要写参数类型,直接root->left=traversal(leftinorder, leftpostorder);就可以
class Solution {
private:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {
if(postorder.size()==0) return NULL;
int rootValue=postorder[postorder.size()-1];
TreeNode* root = new TreeNode(rootValue);
if(postorder.size()==1) return root;
//切割中序数组
int index;
for(index=0;index<inorder.size();index++)
{
if(rootValue==inorder[index]) break;
}
//vector使用迭代器的构造函数是左闭右开[first,last)
vector<int> leftinorder(inorder.begin(),inorder.begin()+index);
vector<int> rightinorder(inorder.begin()+index+1,inorder.end());
//切割后序数组
//中序切割出来的左子树 和 后序的左子树是一样的
postorder.resize(postorder.size()-1);
vector<int> leftpostorder(postorder.begin(),postorder.begin()+leftinorder.size());
vector<int> rightpostorder(postorder.begin()+leftinorder.size(),postorder.end());
//递归
root->left=traversal(leftinorder, leftpostorder);
root->right=traversal(rightinorder,rightpostorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
//if(postorder.size()==0||postorder.size()==1)
return traversal(inorder,postorder);
}
};
105. 中序和前序遍历
1. 切片就是c++中的vector,可变数组。
2. 切片截取一部分元素比较简单
3. 语法和cpp有些不一样
//Go中有问题的语法
if *** {
*****
}
//初始化一个结构体指针
root:=&TreeNode{Val:rootvalue}
func traversal(preorder[]int,inorder []int) *TreeNode{
if len(preorder)==0{
return nil
}
rootvalue:=preorder[0]
root:=&TreeNode{Val:rootvalue}
if len(preorder)==1{
return root
}
//找到中间的结点
var index int
for i,val:=range inorder{
if val==rootvalue{
index=i
break
}
}
//切割中序数组
leftinorder:=inorder[:index]//切片也是左闭右开
rightinorder:=inorder[index+1:]
//切割前序数组
leftpreorder:=preorder[1:len(leftinorder)+1]
rightpreorder:=preorder[1+len(leftinorder):]
//递归
root.Left=traversal(leftpreorder,leftinorder)
root.Right=traversal(rightpreorder,rightinorder)
return root
}
func buildTree(preorder []int, inorder []int) *TreeNode {
return traversal(preorder,inorder)
}