数据结构二叉树中序遍历_数据结构二叉树先序

数据结构二叉树中序遍历_数据结构二叉树先序二叉树中序遍历二叉树中序遍历的实现思想是:访问当前节点的左子树 访问根节点 访问当前节点的右子树图1二叉树以上图1为例,中序遍历的过程如下:访问该二叉树的根节点,找到1 遍历节点1的左子树,找到节点2 遍历节点2的左子树,找到节点4 由于节点4无左孩子,因此找到节点4,并遍历节点4的右子树 由于节点4无右子树,因此节点2的左子树遍历完成,访问节点2 遍历节点2的右子树,找到节点5 由于节点5无左子树,因此访问节点5


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

二叉树中序遍历

二叉树中序遍历的实现思想是:

  1. 访问当前节点的左子树
  2. 访问根节点
  3. 访问当前节点的右子树

数据结构二叉树中序遍历_数据结构二叉树先序

图 1 二叉树

以上图 1 为例,中序遍历的过程如下:

  1. 访问该二叉树的根节点,找到 1
  2. 遍历节点 1 的左子树,找到节点 2
  3. 遍历节点 2 的左子树,找到节点 4
  4. 由于节点 4 无左孩子,因此找到节点 4,并遍历节点 4 的右子树
  5. 由于节点 4 无右子树,因此节点 2 的左子树遍历完成,访问节点 2
  6. 遍历节点 2 的右子树,找到节点 5
  7. 由于节点 5 无左子树,因此访问节点 5 ,又因为节点 5 没有右子树,因此节点 1 的左子树遍历完成,访问节点 1 ,并遍历节点 1 的右子树,找到节点 3
  8. 遍历节点 3 的左子树,找到节点 6
  9. 由于节点 6 无左子树,因此访问节点 6,又因为该节点无右子树,因此节点 3 的左子树遍历完成,开始访问节点 3 ,并遍历节点 3 的右子树,找到节点 7
  10. 由于节点 7 无左子树,因此访问节点 7,又因为该节点无右子树,因此节点 1 的右子树遍历完成,即整棵树遍历完成

因此,图 1 中二叉树采用中序遍历得到的序列为:4 2 5 1 6 3 7 

二叉树中序遍历代码实现

先谈一下递归实现!!!

#include <stdio.h>
#include <stdlib.h>
 
typedef struct MyBiTNode{
    int data;  // 数据域
    struct MyBiTNode *lchild, *rchild;  // 左右孩子指针
} BiTNode;

BiTNode *CreateBiTree(BiTNode *T){
	// 结点 1 
    T = (BiTNode*)malloc(sizeof(BiTNode));
    T->data = 1;
    // 结点 2
	T->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->data = 2;
	// 结点 3
	T->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->data = 3;
	// 结点 4 
	T->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->lchild->data = 4;
	T->lchild->lchild->lchild = NULL;
	T->lchild->lchild->rchild = NULL;
	// 结点 5
	T->lchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->rchild->data = 5;
	T->lchild->rchild->lchild = NULL;
	T->lchild->rchild->rchild = NULL;
	// 结点 6
	T->rchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->lchild->data = 6;
	T->rchild->lchild->lchild = NULL;
	T->rchild->lchild->rchild = NULL;
	// 结点 7
	T->rchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->rchild->data = 7; 
	T->rchild->rchild->lchild = NULL;
	T->rchild->rchild->rchild = NULL;
	return T;
}
 
// 模拟操作结点元素的函数,输出结点本身的数值
void displayElem(BiTNode* elem){
    printf("%d ", elem->data);
}

// 中序遍历
void INOrderTraverse(BiTNode *T){
    if(T){
        INOrderTraverse(T->lchild);  // 遍历左孩子
        displayElem(T);  // 调用操作结点数据的函数方法
        INOrderTraverse(T->rchild);  // 遍历右孩子
    }
    // 如果结点为空,返回上一层
    return;
} 

int main() {
    BiTNode *Tree = NULL;  // 结构体指针指向空 
    Tree = CreateBiTree(Tree);  // 传入结构体指针 
    printf("%d\n",Tree->rchild->lchild->data);  // 6
    
    INOrderTraverse(Tree);
    return 0;
}

再谈一下非递归实现!!!

#include <stdio.h>
#include <stdlib.h>

int top = -1;  // top变量表示栈顶元素所在位置
 
typedef struct MyBiTNode{
    int data;  // 数据域
    struct MyBiTNode *lchild, *rchild;  // 左右孩子指针
} BiTNode;

BiTNode *CreateBiTree(BiTNode *T){
	// 结点 1 
    T = (BiTNode*)malloc(sizeof(BiTNode));
    T->data = 1;
    // 结点 2
	T->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->data = 2;
	// 结点 3
	T->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->data = 3;
	// 结点 4 
	T->lchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->lchild->data = 4;
	T->lchild->lchild->lchild = NULL;
	T->lchild->lchild->rchild = NULL;
	// 结点 5
	T->lchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->lchild->rchild->data = 5;
	T->lchild->rchild->lchild = NULL;
	T->lchild->rchild->rchild = NULL;
	// 结点 6
	T->rchild->lchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->lchild->data = 6;
	T->rchild->lchild->lchild = NULL;
	T->rchild->lchild->rchild = NULL;
	// 结点 7
	T->rchild->rchild = (BiTNode*)malloc(sizeof(BiTNode));
	T->rchild->rchild->data = 7; 
	T->rchild->rchild->lchild = NULL;
	T->rchild->rchild->rchild = NULL;
	return T;
}
 
// 模拟操作结点元素的函数,输出结点本身的数值
void displayElem(BiTNode* elem){
    printf("%d ", elem->data);
}

// 先序和中序遍历使用的进栈函数
void push(BiTNode **a, BiTNode *elem){
    a[++top] = elem;
}

// 弹栈函数
void pop(){
    if(top == -1){
        return;
    }
    top--;
}

// 拿到栈顶元素
BiTNode *getTop(BiTNode **a){
    return a[top];
}

// 中序遍历非递归算法
void InOrderTraverse_1(BiTNode *Tree){
    BiTNode *a[20]; 
    BiTNode *p; 
    push(a, Tree);  
    while(top != -1){  
        while((p = getTop(a)) && p){ 
            push(a, p->lchild);
        }
        pop();
        if(top != -1){
            p = getTop(a);
            pop();
            displayElem(p);
            push(a, p->rchild);
        }
    }
}

// 中序遍历实现的另一种方法
void InOrderTraverse_2(BiTNode *Tree){
    BiTNode *a[20];
    BiTNode *p;
    p = Tree;
    while(p || top!=-1){
        if(p){
            push(a, p);
            p = p->lchild;
        }else{  // 如果 p为 NULL,表明左子树遍历完成,需要遍历上一层结点的右子树 
            p = getTop(a);
            pop();
            displayElem(p);
            p = p->rchild;
        }
    }
}

int main() {
    BiTNode *Tree = NULL;  // 结构体指针指向空 
    Tree = CreateBiTree(Tree);  // 传入结构体指针 
    printf("%d\n",Tree->rchild->lchild->data);  // 6
    
    InOrderTraverse_2(Tree);
    InOrderTraverse_2(Tree);
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/193929.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android toast全屏,Android Toast实现全屏显示

    android toast全屏,Android Toast实现全屏显示本文为大家分享了AndroidToast全屏显示的具体代码,供大家参考,具体内容如下废话不说,直接上代码:privatevoidtoastFullScreen(){Toasttoast=Toast.makeText(this,null,Toast.LENGTH_LONG*10*1000);toast.setGravity(Gravity.CENTER,0,0);Line…

    2022年9月13日
  • 线匹配之LBD_终端匹配

    线匹配之LBD_终端匹配参考链接:1.线特征—LineMatching代码运行(五)

    2022年10月29日
  • 基于FPGA的SDRAM控制器设计(一)「建议收藏」

    基于FPGA的SDRAM控制器设计(一)「建议收藏」基于FPGA的SDRAM控制器设计(一)1.SDRAM控制器整体框架2.UART_RX模块3.UART_TX模块4.RX与TX模块的整合5.需要注意的问题1.SDRAM控制器整体框架图1.1整体框架PC端通过串口模块UART_RX发送读写命令以及数据到Cmd_encode模块,由后者分离出数据存入wfifo模块,剩下的读写命令传送到Sdram_top模块对SDRAM进行写操作或者从SDRAM读数据到rfifo模块并通过UART_TX模块将数据送出到PC端。2.UART_RX模块主体代码(见

    2022年7月25日
  • Axure的动态面板制作tab切换效果

    Axure的动态面板制作tab切换效果最近进行机房合作画原型图的时候用到了Axure画图软件,画出来的图感觉棒棒哒!在画结账窗体的时候确实遇到了一些问题,因为有动态效果图,点击不同的Tab时要有不同的界面显示,所以学习了一下!

    2022年5月18日
  • 如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]

    如何从tushare获取股票历史数据写入自己的MySQL数据库[通俗易懂]如何从tushare获取股票历史数据写入自己的MySQL数据库点击https://tushare.pro/register?reg=414428,免费注册后,即可获取tushare的token,就可以下载金融数据了。1.tushare推荐方法如果你需要读取全部股票的历史数据,tushare给的建议是按“天”获取。因为tushareapi限制一次获取最高5000条记录,而A股市场目前有3000多只股票,提取一次数据不会超过api的限制记录数。代码如下:importtus

    2022年6月24日
  • php Restful设计

    php Restful设计

    2021年10月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号