一 二叉树的建立
1 根据先序,中序建立二叉树
代码如下
//头文件不写了(哈哈哈)
int pre[maxn],in[maxn],post[maxn];
int n;
node* create(int preL,int preR,int inL,int inR)
{
if(preL>preR)
return NULL;
node *root=new node;
root->data=pre[preL];
int k;
for(k=inL;k<inR;k++)
{
if(in[k]==pre[preL])
break;
}
int numleft= k-inL;
root->lchild=create(preL+1,preL+numleft,inL,k-1); //注意推导,推导不难 但注意细节
root->rchild=create(preL+numleft+1,preR,k+1,inR);
return root;
}
node *root=create(0,n-1,0,n-1);//调用建树
2根据中序后序建树
int pre[maxn],in[maxn],post[maxn];//先序中序后序
int n;
node *create(int postL,int postR,int inL,int inR)
{
if(postL>postR)
return NULL;
node *root=new node;//用于存放新节点
root->data=post[postR];
int k;
for(k=inL;k<=inR;++k)
{
if(in[k] == post[postR])
{
break;
}
}
int numleft=k-inL;
root->lchild=create(postL, postL+numleft-1,inL,k-1);//返回左子树根节点 赋值给根的左指针
root->rchild=create(postL+numleft,postR-1, k+1,inR);
return root;//返回根节点
}
原理同上
3利用二叉树的静态写法 建树
//由于本题中给定的是结点的编号的关系 所以采用二叉树的静态写法 就是用数组结构体的方式存 因为没有对应的data
// 只有结点,用静态写法比较好 如 PAT 1102
二 遍历方法
先序 中序 后序很基础 就不写了
1 bfs算法 借助队列(层序遍历)
void bfs(node *root)
{
queue<node*> q;//注意 队列中存地址
q.push(root);//根节点入队
while(!q.empty())
{
node *now=q.front();//取出队首元素
q.pop(); 不要忘记pop*()
printf("%d",now->data);
num++;
if(num<n)
cout<<" ";
if(now->lchild !=NULL) q.push(now->lchild);
if(now->rchild !=NULL) q.push(now->rchild); //注意是now 不是root
}
}
三 二叉排序树 完全二叉树等
1 完全二叉树的建立可以用数组 left = root *2 right = root * 2+1, 利用这一项建立二叉树 判断root > n, 作为退出条件
2注意二叉排序树的中序遍历是 递增的
完全的二叉排序树 直接按中序遍历递增建树即可 顺序输出为层序遍历的顺序
3 使用bfs时 不要忘记pop()