数据结构考研 - 树与二叉树(C语言)

1. 存储结构

1.1 顺序存储结构

1.2 链式存储结构

typedef strcture BTNode
{
  char data;
  struct BTNode *lchild;
  struct BTNode *rchild;
}BTNode;

1.2.1 孩子存储结构

1.2.2 树的孩子兄弟存储结构

把树转换成二叉树的样子,进行存储

typedef struct BTNode
{
  int data;
  BTNode* child;
  BTNode* sibling;
} BTNode;
// 链接:
A1->child=A2;
A1->sibling=NULL;
A2->sibling= A3;
A3->sibling=A4;
A4->sibling=NULL;
// 取A1孩子结点A3:
A1->child->sibling

2. 遍历

2.1 二叉树的遍历 - 递归算法

void preorder(BTNode *p)
{
  if(p!=NULL)
  {
    //(1)Visit(p)
    preorder(p->lchild);
    //(2)Visit(p)
    preorder(p->rchild);
    //(3)Visit(p)
  }
}
// 假设访问函数visit()已经定义过
// Visit(p)则在(1)、(2)、(3)处
// 分别是先序、中序和后序遍历。

2.2 层次遍历

需要建立一个循环队列

void level(BTNode *p)
{
  int front, rear;
  BTNode *que[maxSize];
  // 定义一个循环队列,用来记录将要访问
  // 的层次上的结点
  front = rear=0;
  BTNode *q;
  if(p!=NULL)
  {
    rear=(rear+1)%maxSize;
    que[rear]=p; // 根节点入队
    while(front!=rear)  //当队列不空的时候进行循环
    {
      front=(front+1)%maxSize;
      q = que[front];  // 队头结点出队
      Visit(q);  //放问队头结点
      if(q->lchild!=NULL)  //如果左子树不空,则左子树的根结点入队
      {
        rear=(rear+1)%maxSize;
        que[rear]=q->lchild;
      }
      if(q->rchild!=NULL) // 如果右子树不空,则右子树的根节点入队
      {
        rear=(rear+1)%maxSize;
        que[rear]=q->rchild
      }
    }
  }
}

2.3 线索二叉树

2.3.1 线索化

通过中序遍历对二叉树线索化的递归算法

void InThread(TBTNode *p, TBTNode *&pre)
{
    if(p!=NULL)
    {
        InThread(p->lchild,pre);
        if(p->lchile==NULL)
        /* 建立当前结点的前驱线索 */
        {
            p->lchild=pre;
            p->ltag=1;
        }
        if(pre!=NULL&&pre->rchild==NULL)
        /* 建立前驱结点的后继线索 */
        {
            pre->rchild=p;
            pre->rtag=1;
        }
        pre=p; 
        //pre指向当前的p,作为p将要指向的下一个结点的前驱结点指示指针
        p=p->rchild; 
        //p指向一个新结点,此时pre 和p分别指向的结点形成了一个前驱后继对
        InThread(p,pre)
    }
}
2.3.2 建立中序线索二叉树

通过中序遍历建立中序线索二叉树

void createInThread(TBTNode *root)
{
    TBTNode *pre=NULL; //前驱结点指针
    if(root!=NULL)
    {
        InThread(root,pre);
        pre->rchild=NULL; //非空二叉树,线索化
        pre->rtag=1 //后处理中序最后一个结点
    }
}
2.3.3 遍历中序线索二叉树
求以p为根的中序线索二叉树中,中序序列下的第一个结点
TBTNode *First(TBTNode *p)
{
    while(p->ltag==0)
        p=p->lchild;  // 最左下结点(不一定是叶结点)
    return p;
}
求在中序线索二叉树中,结点p在中序下的后继结点
TBTNode *Next(TBTNode *p)
{
    if(p->rtag==0)
        return First(p->rchild);
    else
        return p->rchild; //rtag==1,直接返回后继线索
}
遍历中序线索二叉树
void Inorder(TBTNode *root)
{
    for(TBTNode *p=First(root);p!=NULL;p=Next(p))
        Visit(p)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值