实现二叉树各种遍历算法

简介: 实现二叉树各种遍历算法

目录



前言

提示:记得关注我哦!!!


一、题目

1.二叉树的各种遍历过程及遍历算法设计。

(1) 先序遍历二叉树;

(2) 中序遍历二叉树;

(3)后序遍历二叉树。


2.实现二叉树各种遍历算法

代码如下(示例):

#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
  ElemType data;
  struct node *lchild;
  struct node *rchild;
}BTNode;
void CreateBTree(BTNode *&b,char *str)
{
  BTNode * St[MaxSize],*p;
  int top=-1,k,j=0;char ch;
  b=NULL;
  ch=str[j];
  while(ch!='\0')
  {
    switch(ch)
    {
    case'(':top++;St[top]=p;k=1;break;
    case')':top--;break;
    case',':k=2;break;
    default:p=(BTNode *)malloc(sizeof(BTNode));
      p->data=ch;p->lchild=p->rchild=NULL;
      if(b==NULL)
        b=p;
      else
      {
        switch(k)
        {
                case 1:St[top]->lchild=p;break;
        case 2:St[top]->rchild=p;break;
        }
      }
    }
    j++;ch=str[j];
  }
}
void DestroyBTree(BTNode *&b)
{
  if(b!=NULL)
  {
    DestroyBTree(b->lchild);
        DestroyBTree(b->rchild);
    free(b);
  }
}
BTNode *FindNode(BTNode *b,ElemType x)
{
  BTNode *p;
  if(b==NULL)
    return NULL;
  else if(b->data==x)
    return b;
  else
  {
    p=FindNode(b->lchild,x);
    if(p!=NULL)
      return p;
    else
      return FindNode(b->rchild,x);
  }
}
BTNode *LchildNode(BTNode *p)
{
  return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
  return p->rchild;
}
int BTHeight(BTNode *b)
{
  int lchildh,rchildh;
  if(b==NULL)return(0);
  else
  {
    lchildh=BTHeight(b->lchild);
    rchildh=BTHeight(b->rchild);
    return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
  }
}
void DispBTree(BTNode *b)
{
  if(b!=NULL)
  {
    printf("%c",b->data);
    if(b->lchild!=NULL||b->rchild!=NULL)
    {
      printf("(");
      DispBTree(b->lchild);
      if(b->rchild!=NULL)printf(",");
      DispBTree(b->rchild);
      printf(")");
    }
  }
}
#include"btree.cpp"
void PreOrder(BTNode *b)
{
  if(b!=NULL)
  {
    printf("%c",b->data);
    PreOrder(b->lchild);
    PreOrder(b->rchild);
  }
}
void PreOrderl(BTNode *b)
{
  BTNode *St[MaxSize],*p;
  int top = -1;
  if(b!=NULL)
  {
    top++;
    St[top]=b;
    while(top>-1)
    {
      p=St[top];
      top--;
      printf("%c",p->data);
      if(p->rchild!=NULL)
      {
        top++;
        St[top]=p->rchild;
      }
      if(p->lchild!=NULL)
      {
        top++;
        St[top]=p->lchild;
      }
    }
    printf("\n");
  }
}
void InOrder(BTNode *b)
{
  if(b!=NULL)
  {
    InOrder(b->lchild);
    printf("%c",b->data);
    InOrder(b->rchild);
  }
}
void InOrderl(BTNode *b)
{
  BTNode *St[MaxSize],*p;
  int top = -1;
  if(b!=NULL)
  {
    p=b;
    while(top>-1 || p!=NULL)
    {
      while(p!=NULL)
      {
        top++;
        St[top]=p;
        p=p->lchild;
      }
      if(top>-1)
      {
        p=St[top];
        top--;
        printf("%c",p->data);
        p=p->rchild;
      }
    }
    printf("\n");
  }
}
void PostOrder(BTNode *b)
{
  if(b!=NULL)
  {
    PostOrder(b->lchild);
    PostOrder(b->rchild);
    printf("%c",b->data);
  }
}
void PostOrderl(BTNode *b)
{
  BTNode *St[MaxSize],*p;
  int top = -1;
  bool flag;
  if(b!=NULL)
  {
    do
    {    while(b!=NULL)
      { 
        top++;
        St[top]=p;
        b=b->lchild;
      }
        p=NULL;
      flag=true;
      while(top!=-1&&flag)
      {
        b=St[top];
        if(b->rchild==p)
        {
            printf("%c",b->data);
            top--;
            p=b;
        }
        else
        {
          b=b->rchild;
          flag=false;
        }
      }
    }while(top!=-1);
    printf("\n");
  }
}
void TravLevel(BTNode *b)
{
  BTNode *Qu[MaxSize];
  int front,rear;
  front = rear=0;
  if(b!=NULL)printf("%c",b->data);
  rear++;
  Qu[rear]=b;
  while(rear!=front)
  {
    front=(front+1)%MaxSize;
    b=Qu[front];
    if(b->lchild!=NULL)
    {
      printf("%c",b->lchild->data);
      rear=(rear+1)%MaxSize;
      Qu[rear]=b->lchild;
    }
    if(b->rchild!=NULL)
    {
      printf("%c",b->rchild->data);
      rear=(rear+1)%MaxSize;
      Qu[rear]=b->rchild;
    }
  }
  printf("\n");
}
int main()
{
  BTNode *b;
  CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
  printf("二叉树b:");DispBTree(b);printf("\n");
  printf("层次遍历序列:");
  TravLevel(b);
  printf("先序遍历序列:\n");
  printf("   递归算法:");PreOrder(b);printf("\n");
  printf(" 非递归算法:");PreOrder(b);printf("\n");
  printf("中序遍历序列:\n");
  printf("   递归算法:");InOrder(b);printf("\n");
  printf(" 非递归算法:");InOrder(b);printf("\n");
  printf("后序遍历序列:\n");
  printf("   递归算法:");PostOrder(b);printf("\n");
  printf(" 非递归算法:");PostOrder(b);printf("\n");
  DestroyBTree(b);
  return 1;
}


总结

我是不会飞的飞鸟,肝文不易,如果本次文章对你有帮助点赞关注支持一下,谢谢!


相关文章
|
3天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
34 5
|
1月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
64 5
|
1月前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
39 2
|
1月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
48 0
|
2月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
32 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
2月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
38 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
4天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
117 80
|
1天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
23天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。

热门文章

最新文章