二叉树的学习

百度的笔试有关于二叉树的遍历,当时总想着我怎么可能做出来,后来在仔细想下其实很简单
二叉树的数据结构:

typedef struct node{
   int data;
   struct node * lchild;
   struct node * rchild;
}BiTNode,*BiTree;

1、二叉树的创建过程无非就是一个递归创建的过程,最后返回的是根结点的指针
先序的方式在创建

Bitree Create(BiTree T){
   char ch;
   ch=getchar();
   if(ch=='#')
      T=NULL;
   else{
     T=(BiTree)malloc(sizeof(BiTNode));
     if(T==NULL)
       printf("Error!");
     T->data=ch;
     T->lchild=Create(T->lchild);
     T->rchild=Create(T->rchild);
   }
   return T;
}

遍历

void Preorder(BiTree T){
    if(T==NULL)
      return ;
    putchar(T->data);
    Preorder(T->lchild);
    Preorder(T->rchild);
}

求二叉树的深度
也是分治 (把大的问题分解成小的问题)递归的思想

int depth(BiTree T){
  int dep=0,depl,depr;
  if(!T)
    dep=0;
  else{
  depl=depth(T->lchild);
  depr=depth(T->rchild);
  dep=1+(depl>depr?depl:depr);
  }
  return dep;
}

求叶子结点

int sumdef(BiTree T){
  int sum=0,rdeaf=0,ldeaf=0;
  if(T==NULL)
    return 0;
  if(T->lchild==NULL&&T->rchild==NULL)
      sum++;
  rdeaf=sumdef(T->lchild);
  ldeaf=sumdef(T->rchild);
  sum=sum+rdeaf+ldeaf;
  return sum;
}

分层遍历二叉树
先了解下C++中队列的相关知识:
queue模板类也要两个参数,元素类型和容器类型
1.入队:push(x)
2.出队: pop()不会返回被弹出元素的值
3.访问队首元素,如例:q.front(),即最早被压入队列的元素。
4.访问队尾元素,如例:q.back(),即最后被压入队列的元素。
5.判断队列空,如例:q.empty(),当队列空时,返回true。
6.访问队列中的元素个数,如例:q.size()

void cengci(BiTree T){
    queue<BiTree> q;//创建存放结点指针的队列
    if(T){
     q.push(T);
     while(!q.empty()){
       BiTree node=q.front();
       q.pop();
       printf("%d",node->data);
       if(node->lchild!=NULL)
           q.push(node->lchild);
       if(node->rchild!=NULL)
           q.push(node->rchild);

     }
    }
}

将二叉查找树变为有序的双向链表

待续。。。

求二叉树第K层的节点个数
1.二叉树为空或者k<1返回0;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值