数据结构项目——二叉树实现

简介: 数据结构项目——二叉树实现

案例分析:


写出下面二叉树的先、中、后序遍历输出的结果:


注:先自己推算,然后用程序验算。



先序遍历的结果:A F H D C B J G E I K


中序遍历的结果:D H C F J B G A I E K


后序遍历的结果:D C H J G B F I K E A


代码如下:


#include "pch.h"
#include <iostream>
using namespace std;
int top = -1;
typedef struct Bitnode
{
  char data;
  Bitnode *lchild, *rchild;
}Bitnode,*bittree;
//创建一个二叉树
void Createbittree(bittree *t)
{
  *t =(Bitnode *) malloc(sizeof(Bitnode));
  (*t)->data = 'A';
  (*t)->lchild= (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->rchild =(Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->data = 'F';
  (*t)->rchild->data = 'E';
  (*t)->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->lchild->data = 'H';
  (*t)->lchild->rchild->data = 'B';
  (*t)->rchild->lchild->data = 'I';
  (*t)->rchild->rchild->data = 'K';
  (*t)->rchild->lchild->lchild= NULL;
  (*t)->rchild->lchild->rchild= NULL;
  (*t)->rchild->rchild->lchild = NULL;
  (*t)->rchild->rchild->rchild = NULL;
  (*t)->lchild->lchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->lchild->lchild->lchild = NULL;
  (*t)->lchild->lchild->lchild->rchild = NULL;
  (*t)->lchild->lchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->lchild->rchild->lchild = NULL;
  (*t)->lchild->lchild->rchild->rchild = NULL;
  (*t)->lchild->rchild->lchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->rchild->lchild->lchild = NULL;
  (*t)->lchild->rchild->lchild->rchild = NULL;
  (*t)->lchild->rchild->rchild = (Bitnode *)malloc(sizeof(Bitnode));
  (*t)->lchild->rchild->rchild->lchild = NULL;
  (*t)->lchild->rchild->rchild->rchild = NULL;
  (*t)->lchild->lchild->lchild->data = 'D';
  (*t)->lchild->lchild->rchild->data = 'C';
  (*t)->lchild->rchild->lchild->data = 'J';
  (*t)->lchild->rchild->rchild->data = 'G';
}
//先序遍历入栈
void Push(Bitnode **a,Bitnode *elem)
{
  a[++top] = elem;
}
//先序遍历出栈
void Pop()
{
  if (top==-1)
  {
    return;
  }
  top--;
}
//获取栈顶元素
Bitnode *Get_top(Bitnode**a)
{
  return a[top];
}
//输出节点数据
void Printelem(Bitnode *elem)
{
  cout << elem->data << "  ";
}
//实现先序遍历算法
void preorder(Bitnode*tree)
{
  Bitnode *a[30];
  Bitnode *p;
  Push(a, tree);
  while (top!=-1)
  {
    p = Get_top(a);
    Pop();
    while (p)
     {
      Printelem(p);
      if (p->rchild)
      {
        Push(a,p->rchild);
      }
      p = p->lchild;
    }
  }
}
//中序遍历二叉树
void inorder(bittree tree)
{
  Bitnode *a[30]; //定义一个顺序栈
  Bitnode *p;   //临时指针
  Push(a, tree);  //根节点入栈
  while (top != -1) //top!=-1来判定栈是否为空
  {
    while ((p=Get_top(a))&&p)//获取栈顶元素不为空
    {
      //左子树节点入栈,如果没有,null入栈
      Push(a, p->lchild);
    }
    Pop();//跳出循环,栈顶元素是空,
    if (top!=-1)
    {
      p = Get_top(a);//获取栈顶元素
      Pop();
      Printelem(p);
      Push(a,p->rchild);//右子树节点入栈
    }
  }
}
//二叉树后序遍历(非递归法)
struct Snode
{
  bittree p;
  int tag;
};
//后序遍历的入栈函数
void PostPush(Snode*a, Snode sdata)
{
  a[++top] = sdata;
}
//后序遍历
void PostOrder(bittree tree)
{
  Snode a[20];
  Bitnode*p;    //节点指针
  int tag;
  Snode sdata;
  p = tree;
  while (p||top!=-1)//用的或,这两种都行
  {
    while (p)
    {
      sdata.p = p;
      sdata.tag = 0;//遍历左子树,设置标记位为0
      PostPush(a, sdata);//入栈
      p = p->lchild;//以该节点为根节点,遍历左子树
    }
    sdata=a[top];
    Pop();
    p = sdata.p;
    tag = sdata.tag;
    if (tag==0)//条件为真,左子树遍历完成,该节点需要遍历右子树
    {
      sdata.p = p;
      sdata.tag = 1;
      PostPush(a, sdata);//更改节点标志位,重新入栈
      p = p->rchild;//将该节点的右子树设置为根节点,重新循环
    }
    else
    {
      Printelem(p);
      p = NULL;
    }
  }
}
int main()
{
  bittree tree;
  Createbittree(&tree);
  cout << "先序遍历的结果为:";
  preorder(tree);
  cout << endl;
  cout << "中序遍历的结果为:";
  inorder(tree);
  cout << endl;
  cout << "后序遍历的结果为:";
  PostOrder(tree);
  cout << endl;
  return 0;
}


结果为:


相关文章
|
17天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
65 8
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
20 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
24 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
27 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
24 1
|
1月前
|
存储 算法
探索数据结构:分支的世界之二叉树与堆
探索数据结构:分支的世界之二叉树与堆
|
1月前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
25 0
|
18天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
93 9
|
9天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
18 1
|
11天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。