二叉树

主要是对二叉树的遍历,构造,还原

题目一:

二叉树的遍历
给定二叉树的前序遍历序列和中序遍历序列,求其后序遍历序列

struct Node{
  Node *lchild;
  Node *rchild;
  char c;
}Tree[50];   //静态内存分配数组

利用分配数组元素给相应的节点实现内存分配,这是对内存分配较为简单的实现方法

int loc; //静态数组中已经分配的节点个数

Node *creat(){
     Tree[loc].lchild = Tree[loc].rchild = NULL;
     return &Tree[loc++]; //返回指针,且loc累加
}
void postOrder(Node *T)  //后序遍历
{
  if(T->lchild !=NULL)
  {
    postOrder(T->lchild);
  }
  if(T->rchild !=NULL)
  {
    postOrder(T->lchild);
  }
  printf("%c",T->c);
}
//核心-构造树
Node *build(int s1,int e1,int s2,int e2)
{
  Node* ret = creat(); //为树根节点申请空间
  ret->c = strl[s1];
  int rootIdx;
  //查找该根节点字符在中序遍历中的位置
  for(int i=s2;i<=e2;i++)
  {
    if(str2[i]==str1[s1])
    {
      rootIdx = i;
      break;
    }
  }
  if(rootIdx!=s2)
  {
    ret->lchild = build(s1+1,s1+(rootIdx-s2),s2,rootIdx-1);
  }
  if(rootIdx !=e2)
  {
    ret->rchild = build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2);
  }
  return ret;  
}
int main()
{
     while(scanf("%s",str1)!=EOF)
     {
       scanf("%s",str2);
       loc = 0;
         int L1 = strlen(str1);
         int L2 = strlen(str2);
         Node *T = build(0,L1-1,0,L2-1);
         postOrder(T);  //后序遍历,输出节点信息
         printf("\n");
     }     
     return 0;

}

题目二: 完全二叉树 ????

特点:叶子结点只可能在层次最大的两层上出现;对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l+1

由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

#include <stdio.h>

int main(void){
    int m,  n, cnt, num, left, right;

    while (scanf ("%d%d", &m, &n) != EOF && m != 0 && n != 0){
        cnt = num = 1;
        left = 2 * m;
        right = 2 * m + 1;
        while (right <= n){
            num *= 2;
            cnt += num;
            left *= 2;
            right = 2 * right + 1;
        }
        if (left <= n)
            cnt += (n-left+1);
        printf ("%d\n", cnt);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值