实现二叉树各种基本运算的算法

简介: 实现二叉树各种基本运算的算法

二叉树存储结构和二叉树中各种基本算法设计

(1) 创建二叉树;

(2) 输出二叉树;

(3) 输出‘H’结点的左右孩子结点值;

(4) 输出二叉树的高度;

(5) 释放二叉树。

#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(")");
    }
  }
}
int main()
{
  BTNode *b,*p,*lp,*rp;;
  printf("二叉树的基本运算如下:\n");
  printf("  (1)创建二叉树\n");
  CreateBTree(b,"A(B(D,E(H(J,k(L,M(,N))))),C(F,G(,I)))");
  printf("  (2)输出二叉树:");DispBTree(b);printf("\n");
  printf("  (3)H结点:");
  p=FindNode(b,'H');
  if(p!=NULL)
  {  lp= LchildNode(p);
     if(lp!=NULL)printf("左孩子为%c",lp->data);
     else printf("无左孩子");
     rp=RchildNode(p);
     if(rp!=NULL) printf("右孩子为%c",rp->data);
     else printf("无右孩子");
  }
  printf("\n");
  printf("  (4)二叉树b的高度:%d\n",BTHeight(b));
  printf("  (5)释放二叉树b\n");
  DestroyBTree(b);
  return 1;
}

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


相关文章
|
4月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
42 4
|
11天前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
13 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
11天前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
14 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
15天前
|
存储 算法
【二叉树】—— 算法题
【二叉树】—— 算法题
【二叉树】—— 算法题
|
4月前
|
存储 算法
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
【数据结构和算法】--- 二叉树(4)--二叉树链式结构的实现(2)
35 0
|
4月前
|
存储 算法 Linux
【数据结构和算法】---二叉树(1)--树概念及结构
【数据结构和算法】---二叉树(1)--树概念及结构
45 0
|
11天前
|
存储 算法
数据结构与算法学习十六:树的知识、二叉树、二叉树的遍历(前序、中序、后序、层次)、二叉树的查找(前序、中序、后序、层次)、二叉树的删除
这篇文章主要介绍了树和二叉树的基础知识,包括树的存储方式、二叉树的定义、遍历方法(前序、中序、后序、层次遍历),以及二叉树的查找和删除操作。
15 0
|
2月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
22 0
|
2月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
72 0
|
2月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
37 0