二叉树的常见问题,遍历 先序 中序后序建树

一 二叉树的建立

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()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值