数据结构------------二叉树(最通俗易懂的文章)

二叉树

简要

二叉树是一种特殊的树,它只有两个节点,左节点和右节点,满二叉树和完全二叉树这里就不做介绍了。

和前面讲述的一样,也有链式和顺序表达,比较常用的链式,树的结构体表示为递归形式,就是在结构体里面再来一个结构体,然后结构体里面再来结构体,就构成了二叉树的数据结构。因此就有了二叉树的节点定义:
在这里插入图片描述
因此以上为树节点的结构图,中间为数据域,两边为指针域,实现链式的实现,和之前讲的链式表类似。每个节点为数据域和指针域,只是树节点为两个指针域,实现左右节点的连接

typedef struct BiTNode{
  ElemType data;                //创造数据域
  struct BiTNode *lchild,*rchild;        //创造左右子树指针域,实现左右子树的连接 
} BiTNode,*BiTree;

二叉树的初始化创建都为递归形式来创建,二叉树结构体如上所示就为递归形式.这里假设创建二叉树的数据域为字符。

void CreateTree(BiTree &T)
 {
  char t;
  scanf("%c",&t);
  getchar();           //消除回车键的影响,否则会直接进行两次scanf,导致第二次scanf失效
  if(t==' ') T=NULL;   //当输入为空格的时候,表示子树为空
  else
  {
   if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))) exit; 
   T->i=t;        //将数据域赋值
   CreateTree(T->lchild);       //使用递归的方法创建子树,可以自己画一个三个节点的简单二叉树示范
   CreateTree(T->rchild);
  } 
 }

假设构建一个简单二叉树,流程如下图所示
在这里插入图片描述还有不理解的可以自己画图,假设创建一个简单的二叉树,一步一步递归即可。

遍历二叉树有,前序中序后序,三种遍历,比较常用中序,先访问左子树,后中,再右,需要栈的辅助作用来,创建栈的一些列操作看前面文章。

该遍历方法为非递归遍历,即索引,当为空就弹栈,使指针指向当初的节点再进行对右子树的遍历

void InOrderTraverse(BiTree &T)
{
 Stack S;                      //创建一个辅助栈
 InitStack(S);                 //初始化栈
 BiTNode *p;                   
 p=T;                          //实现与需要操作的二叉树进行绑定
 while(p||StackEmpty(S))       //当p为空说明已经遍历完所有的节点
 {
  if(p){
   Push(S,p);                  //如果p不为空,说明节点存在,就放入栈中,然后访问左子树,左子树存在,再访问左子树 的左子树,以此类推,若左子树不存在,转到右子树。
   p=p->lchild;
  }
  else
  {                         //当左子树不存在就转到该流程
   Pop(S,p);
   printf("%c",p->i);       //对节点数据的处理,可以根据个人来改变
   p=p->rchild;             //然后对右子树遍历,若右子树也为空,则会退到上一级,对上一级的右子树遍历
  }
 }
 } 

这个过程比较难理解,可以画一个简单的二叉树来理解。

最近发现了一个国外挺牛的网站,将所有数据结构都实现了可视化。你可以调节演示速度,有各种算法演示,比如什么查找之类,红黑树,什么都有。可能就是全英文,看不懂的可以用浏览器的翻译软件。地址如下:

数据结构可视化

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值