因为个人对于二叉树的操作有些地方理解的还不是很到位,所以本篇文章来总结一下二叉树的一些基本操作。那么二叉树的相关概念,这里就不再赘述。(本文用的是链式结构表示二叉树)
结点信息
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x),left(nullptr),right(nullptr)
{
}
};
创建二叉树
通过前序和中序遍历序列创建二叉树
大题步骤:
1.从前序中找出根节点数值,创建一个结点。
2.在中序中找出根节点的下标,以此下标为分界线,左边为左子树,右边为右子树。
3.分别拿出左子树的前序和中序,右子树的前序和中序。
4.继续执行上述操作,知道前序遍历序列为空。
int Find(vector<int>& post,int res)//找结点位置
{
for(int i=0;i<post.size();i++)
{
if(post[i] == res)
return i;
}
return -1;
}
vector<int> Copy(const vector<int> res,int left,int right)//区分左右子树前中序列。
{
vector<int> v;
for(int i=left;i<=right;i++)
{
v.push_back(res[i]);
}
return v;
}
TreeNode* buildTree(vector<int>& pre, vector<int>& post)//方法一,时间复杂度太高
{
if(pre.empty())
return NULL;
//1.得到根结点
int root = pre[0];
TreeNode* node = new TreeNode(root);
//中序遍历中找到根节点的下标
int PoMid = Find