C++二叉树中序非递归遍历(两种方法)

news/2024/11/23 20:10:13/

#include <stdio.h>
#include <malloc.h>

//树结构 
typedef struct kl
{
    int data;
    struct kl *lchild;
    struct kl *rchild;
}bittree;


//栈结构 
typedef struct ji
{
    int top;
    bittree **data;
    int size;
}stack;

//初始化栈
void init(stack *stack,int size)
{
    stack->size = size;
    stack->top = -1;
    stack->data = (bittree**)malloc(size * sizeof(bittree*));
    for(int i = 0 ; i < size  ;i++)
    {
        stack->data[i] = NULL;    
    }    
}

//创建树
bittree *createtree()
{
    bittree *root = NULL;
    int num;
    printf("Please input number:");
    scanf("%d",&num);
    if(num > 0)
    {
        root = (bittree*)malloc(sizeof(bittree));
        root->data = num;
        root->lchild = createtree();
        root->rchild = createtree();
    }
}


//栈的操作 判满
int isfull(stack *stack)
{
    return stack->top == stack->size-1;

//栈的操作 判空
int isempty(stack *stack)
{
    return stack->top == -1; 
}

//栈的操作 入栈 
void input(stack *stack,bittree *root)  
{
    if(isfull(stack)) return; 
    stack->top++;
    stack->data[stack->top] = root;
}

//栈的操作 出栈
bittree *out(stack *stack) 
{
    return stack->data[stack->top--];
}

//栈的操作 返回栈顶元素
bittree *top(stack * stack)
{
   int index;
   if(stack->top==-1) return NULL;
    index=stack->top;
    return stack->data[index];

void midvisitbystack1(bittree *root)//已做演示  
{
    if(root == NULL)
        return ;
    
    stack stack;
    init(&stack,50); //一直到这一步差不多都是一样的 
      
    while(root != NULL)
    {
        input(&stack,root);
        root = root->lchild;     //把最左边的一列树的数据全部存入  
    }    
    
    while(!isempty(&stack))
    {
        root = out(&stack);     //一一读出 当读出的这个树有有孩子时 就可以让它等于它的右孩子  
        printf("%5d",root->data);    //然后再把这个右孩子最左边的一列树的数据全部存入 这样循环就解决了   
        if(root->rchild != NULL)
        {
            root = root->rchild;
            while(root != NULL)
            {
                input(&stack,root);
                root = root->lchild;    
            }
        }
    }
}

 

void midvisitbystack2(bittree *root)//已做演示 
{
    stack stack;
    init(&stack,50);
    
    if(root == NULL)
        return ;
    //中序是左右中 那么再栈中就是 右中左  
    input(&stack,root); //注意的地方1 
    while(!isempty(&stack))
    {
        root = out(&stack);
        if (root == NULL)     return;
        //变的地方就是 先存入根 到了后面读出了根  然后存入右孩子 最后又存入了根   
        //还有一个关键条件是 如果这个数据是叶子 或者是 栈顶元素 那么就可以打印 
        if(root->lchild == NULL&&root->rchild == NULL || !isempty(&stack)&&root->rchild == top(&stack))
        {
            printf("%5d",root->data);
            continue;
        } 
            
        input(&stack,root->rchild);  //右 
        input(&stack,root);//注意的地方2   中 
        if(root->lchild != NULL)    
            input(&stack,root->lchild); //左        
    }

 

 
 
int main()
{
    bittree *root = createtree();
    midvisitbystack2(root);
    return 0;
}


http://www.ppmy.cn/news/69591.html

相关文章

基于springboot框架的电脑商城项目(八)

&#x1f381;&#x1f381;静态资源及sql文件分享 链接&#xff1a;https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd23gr 提取码&#xff1a;23gr 显示购物车列表功能及增加和减少商品数量功能的实现 显示购物车列表&#xff08;一&#xff09;显示购物车列表&#xff…

前端BFC

一、首先我们要先了解常见的定位方案&#xff0c;总共3种&#xff08;普通流、浮动、绝对定位&#xff09; 而BFC是属于普通流的 我们可以把BFC看作为页面的一块渲染区域&#xff0c;他有着自己的渲染规则 简单来说BFC可以看作元素的一种属性&#xff0c;当元素拥有了BFC属性…

MobileOne(CVPR 2023)原理与代码解析

paper&#xff1a;MobileOne: An Improved One millisecond Mobile Backbone official implementation&#xff1a;https://github.com/apple/ml-mobileone third-party implementation&#xff1a;mmpretrain/mobileone.py at main open-mmlab/mmpretrain GitHub 前言 …

24 | 手写分裂器布局

1 前提 Qt 5.14.2 2 分裂器布局 2.1 手写 //整体用水平布局QHBoxLayout* pHLay =new QHBoxLayout(this);//整体的水平分裂器QSplitter* pHSplitter =new QSplitter(Qt::Horizontal,this);QWidget* pLeftWidget =new QWidget(this);pLeftWidget->setStyleSheet("back…

【一起啃书】《机器学习》第五章 神经网络

文章目录 第五章 神经网络5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部极小5.5 其他常见神经网络5.6 深度学习 第五章 神经网络 5.1 神经元模型 神经网络是由具有适应性简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统…

2023年贵州省职业技能大赛“网络安全” 项目比赛任务书

2023年贵州省职业技能大赛“网络安全” 项目比赛任务书 三、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;200分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&…

【云计算•云原生】4.云原生之什么是Kubernetes

文章目录 Kubernetes概念Kubernetes核心概念集群podConfigMap Kubernetes架构master节点的组件worker节点组件 Kubernetes网络架构内部网络外部网络 k8s各端口含义 Kubernetes概念 K8S就是Kubernetes&#xff0c;Kubernetes首字母为K&#xff0c;末尾为s&#xff0c;中间一共有…

LeetCode笔记:Biweekly Contest 104

LeetCode笔记&#xff1a;Biweekly Contest 104 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接&#xff1a;https://leetcode.com/contest/biweekly-contest-104 1. 题目…