第四章

定义:

树状一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一

棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个结点有零个或多个子结点;没有父结点

的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子

树。树是一对多的关系。

二叉树:

在这里插入图片描述

操作:

话不多说,我都写在代码里面。

#include<stdio.h>
#include<malloc.h>
#define crfun (node *)malloc(sizeof(node));
typedef struct node 
{
 char ch;
 struct node *left;
 struct node *right;
}node;
node *scanf_tree()//二叉树的建立 
{
 char ch=getchar();
 if(ch!='\n')
 {
  node *p=crfun;
  if(ch=='#')return NULL;
  else
  {
   p->ch=ch;
   p->left=scanf_tree();
   p->right=scanf_tree();
   return p;
  }
 }
}
void put_tree(node *head)//层序输出 
{
 node *a[10050];
 int i=0,k=0;
 if(head==NULL)return ;
 else a[k++]=head;
 while(i!=k)
 {
  head=a[i++];
  if(head->left!=NULL)a[k++]=head->left;
  if(head->right!=NULL)a[k++]=head->right;
 }
 for(i=0;i<k;i++)printf("%c",a[i]->ch);
}
void put_tree1(node *head)//先序 
{
 if(head==NULL)return ;
 else 
 {
  printf("%c",head->ch);
  put_tree2(head->left);
  put_tree2(head->right);
 }
}
void put_tree2(node *head)//中序 
{
 if(head==NULL)return ;
 else 
 {
  put_tree2(head->left);
  printf("%c",head->ch);
  put_tree2(head->right);
 }
}
void put_tree3(node *head)//后序 
{
 if(head==NULL)return ;
 else 
 {
  put_tree3(head->left);
  put_tree3(head->right);
  printf("%c",head->ch);
 }
}
int main()
{
 node *head;
 head=crfun;
 head=scanf_tree();
 put_tree(head);
}

分类:

1.斜树:所有的节点都只有左子树的二叉树叫做左斜树,所有节点都只有右子树的二叉树叫做右斜树。这俩者统称

为斜树。

2.满二叉树:在一颗二叉树中,如果所有分治都存在左子树和右子树,并且所有叶子节点都在同一层上面,这样的

二叉树称为满二叉树。

3.完全二叉树:对一颗具有n个节点的二叉树按层序编号,如果编号为i (1<=i<=n) 的节点与同样深度的满二叉树中

编号为i的节点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。
在这里插入图片描述

树、森林、二叉树之间的转换

树转换为二叉树:

1.所有兄弟节点之间加一条线。

2.对树中每个节点,只保留他与第一个孩子的节点的连线,删除它与其他孩子节点之间的连线。

3.以树的根节点为轴心将整棵树顺时针旋转一定的角度,使之结构层次分明。

森林转换为二叉树:

森林是由若干个数组成的,所以完全可以理解为,森林中每一棵树都是兄弟。

1.把每个树转换成二叉树

2.第一课二叉树不动,从第二课二叉树开始,依次后一棵二叉树的根节点作为前一颗二叉树的根节点的右孩子,用

线连起来。当所有的二叉树链接起来后就完成了转换。

二叉树转换为树:

1.若某节点的左孩子存在,则将这个左孩子的所有右节点都作为此节点的孩子。将该节点与这些右孩子节点用线链

接起来。

2.删除原二叉树中所有节点与其右孩子节点的连线。

二叉树转换为森林:

判断一棵二叉树能够转为一棵树还是森林其实很简单,就是只要看这棵树根节点有没有右孩子,有就是森林,没有

就是一棵树。

1.从根节点开始,若右孩子存在,则把与右孩子节点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线

删除,直到所有右孩子连线都删除为止,得到分离的二叉树。

2.再将每一颗二叉树转换成树就行了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值