非递归法创建二叉树

简介: 非递归法创建二叉树

   问题分析:递归方法的创建二叉树,是基于系统栈的方式进行函数的调用,从而实现二叉树的创建。我们可以通过自己去构造栈的数据结构实现问题的解决。栈可以起到回溯的作用,使用先序遍历的插入,先一直往左子树插,当到了结束标志:本题中的 . 时开始回溯,往上一个的右子树插,同时可以在二叉链表中加入flag标记元素,方便代码对左右子树的判断。

要点:(1)灵活的运用栈的数据结构实现树内部的逻辑关系。(2)要设置特殊的二叉链表结构,多一个flag变量用来记录,如:flag=0左子树没有设置;flag=1左子树设置,右子树没有设置;flag=2出栈条件。(3)通常在没有重复结点的情况下,需要同时知道先序+中序,或者后序+中序才可以唯一确定一颗树(通过先序或后序确定根节点,通过中序判断左右子树),但是在本题中通过一个特殊的先序遍历,确定空结点的位置来确定唯一树。所以我们在定义一个树节点后,不要着急设置空树,根据 . 判断空树位置。

[问题描述]

任意给定一棵二叉树。试设计一个程序,在计算机中构造该二叉树,并对它进行遍历。要求:使用非递归算法的算法实现。

[输入]

一棵二叉树的结点若无子树,则可将其子树看作“.”,输入时,按照先序序列的顺序输入该结点的内容。对下图,其输入序列为ABD..EH...CF.I..G..,再输入数字K。

image.png

[输出]

 进行遍历后得到的序列

[存储结构]

采用二叉链表存储。

[算法的基本思想]

采用栈的存储结构实现非递归的方法先序序列创建二叉树,再使用队列的存储结构实现非递归的层次遍历

#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define MAXSIZE 10
typedef struct BTNode{
  char a;
  int flag; //flag=0左子树没有设置;flag=1左子树设置,右子树没有设置;flag=2出栈条件 
  struct BTNode *lchild;
  struct BTNode *rchild;
}BTNode, *node;
node createBTNode(node p){
  //创建二叉树,非递归算法 
  BTNode *stack[MAXSIZE];  //定义栈 
  int top = -1;  //初始化栈
  p = (node)malloc(sizeof(BTNode));  //创建根节点 
  char x;
  scanf("%c", &x);
  p->a = x;
  p->flag = 0;
  stack[++top] = p;  //根结点进栈 
  while(top != -1){
    char x;
    scanf("%c", &x);
    if(x == '.'){
      //“.”空结点的表示方式 
      if(stack[top]->flag == 0){
        stack[top]->flag = 1;
        stack[top]->lchild = NULL;
      }
      else if(stack[top]->flag == 1){
        stack[top]->flag = 2;
        stack[top]->rchild = NULL;
      }
    }
    else{
      node q = (node)malloc(sizeof(BTNode));
      q->a = x;
      q->flag = 0;
      if(stack[top]->flag == 0){
        //先插左子树 
        stack[top]->lchild = q;
        stack[top]->flag = 1;
        stack[++top] = q;
      }
      else if(stack[top]->flag == 1){
        //判断是否满足插入右子树的条件 
        stack[top]->rchild = q;
        stack[top]->flag = 2;
        stack[++top] = q;
      }
    }
    while(stack[top]->flag == 2){
      //判断是否满足出栈条件,满足则连续出栈 
      top--;
    }
  }
  return p;
}
void showBTNode(node p){
  //使用非递归,层次遍历进行实现
  BTNode *queue[MAXSIZE];
  int front = 0;
  int rear = 0;
  queue[rear++] = p; //根结点入队 
  while(front != rear){
    if(queue[front]->lchild != NULL){
      queue[rear++] = queue[front]->lchild;
    }
    if(queue[front]->rchild != NULL){
      queue[rear++] = queue[front]->rchild;
    }
    printf("%c", queue[front]->a);
    front++;
  }
} 
int main(){
  node p = createBTNode(p);
  printf("层次遍历结果为:"); 
  showBTNode(p);
}

结构演示:

image.png

目录
相关文章
|
算法 数据挖掘 计算机视觉
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
Python利用K-Means算法进行图像聚类分割实战(超详细 附源码)
1319 0
|
人工智能 运维 监控
AI时代云基础设施的技术创新与展望丨ODCC2023
AI时代云基础设施的技术创新与展望丨ODCC2023
|
存储 SQL 弹性计算
阿里云关系型数据库RDS存储类型区别(ESSD云盘、本地SSD盘和SSD云盘)
阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务。云数据库RDS提供三种数据存储类型:ESSD云盘、本地SSD盘和SSD云盘,本文介绍三种存储类型的区别及选购建议。
1557 0
阿里云关系型数据库RDS存储类型区别(ESSD云盘、本地SSD盘和SSD云盘)
|
12月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
1243 1
MySQL主从复制原理和使用
|
算法 人机交互 调度
进程调度算法_轮转调度算法_优先级调度算法_多级反馈队列调度算法
轮转调度算法(RR)是一种常用且简单的调度方法,通过给每个进程分配一小段CPU运行时间来轮流执行。进程切换发生在当前进程完成或时间片用尽时。优先级调度算法则根据进程的紧迫性赋予不同优先级,高优先级进程优先执行,并分为抢占式和非抢占式。多队列调度算法通过设置多个具有不同优先级的就绪队列,采用多级反馈队列优先调度机制,以满足不同类型用户的需求,从而优化整体调度性能。
613 15
|
存储 算法
动态规划算法学习一:DP的重要知识点、矩阵连乘算法
这篇文章是关于动态规划算法中矩阵连乘问题的详解,包括问题描述、最优子结构、重叠子问题、递归方法、备忘录方法和动态规划算法设计的步骤。
849 0
|
编解码 移动开发 前端开发
详细介绍Viewport Meta标签的作用、属性以及如何在移动端开发中合理使用它,以优化网页的显示效果
【6月更文挑战第14天】本文介绍了HTML的Viewport Meta标签在移动端网页优化中的应用。该标签定义了视口属性,如宽度、高度和缩放,解决屏幕尺寸差异导致的显示问题。通过设置`width=device-width`确保页面适应设备宽度,`initial-scale=1.0`保持原始比例,`user-scalable=no`可禁用手动缩放。此外,使用`viewport-fit=cover`适配不同像素比设备的安全区域。合理利用这些属性能改善移动端网页显示效果。
593 1
|
计算机视觉
OpenCV(十一):图像仿射变换
OpenCV(十一):图像仿射变换
519 0
|
人工智能 算法 计算机视觉
极智AI | 目标检测实现分享一:详解YOLOv1算法实现
大家好,我是极智视界,本文详细介绍一下 YOLOv1 算法的设计与实现,包括训练。
602 0
|
编解码 芯片
复习单片机:8*8点阵--->点亮第一个点(内含:1LED 点阵介绍+2 硬件设计+3 软件设计+4.原始代码+5 实验现象)
复习单片机:8*8点阵--->点亮第一个点(内含:1LED 点阵介绍+2 硬件设计+3 软件设计+4.原始代码+5 实验现象)
889 0
复习单片机:8*8点阵--->点亮第一个点(内含:1LED 点阵介绍+2 硬件设计+3 软件设计+4.原始代码+5 实验现象)