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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • phpstorm 激活码3月最新在线激活

    phpstorm 激活码3月最新在线激活,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    47
  • oracle字符串补齐_oracle去掉字符串后几位

    oracle字符串补齐_oracle去掉字符串后几位一、拼接字符串1、使用“||”来拼接字符串:select’拼接’||’字符串’asStrfromstudent;2、使用concat(param1,param2)函数实现:selectconcat(‘拼接’,’字符串’)asStrfromstudent;注:oracle的concat()方法只支持两个参数,如果拼接多个参数,可以嵌套concat():selectconcat(…

    2026年2月4日
    3
  • html制作百度音乐标签页面,网页调用百度音乐盒

    html制作百度音乐标签页面,网页调用百度音乐盒在自己的网页中嵌入百度音乐盒选择播放自己的音乐完整代码如下:mymusicbody{margin:0;padding:0;}.p{font-size:20px;font-family:”TimesNewRoman”;}.center{width:500px;height:300px;margin:20px00100px;float:left;}请输入格式为“后来,刘若英”百…

    2022年7月25日
    16
  • 内部类与静态内部类的区别_禁止序列化非静态类的内部类

    内部类与静态内部类的区别_禁止序列化非静态类的内部类&nbsp;&nbsp;&nbsp;&nbsp;如果一个类中定义了静态成员变量和静态方法,那么静态方法可以访问静态成员变量,而无法访问非静态成员变量,并且静态成员变量和静态方法是随着类的加载而加载、非静态成员变量和方法的声明周期是由对象的声明周期控制的。&nbsp;&nbsp;&nbsp;&nbsp;静态内部类和非静态内部类同静态方法和非静态方法类似。为什么要使用内部类&nbsp;&n…

    2022年10月11日
    5
  • C#TextBox密码框

    C#TextBox密码框WebForm中的TextBox控件作为密码框(如图1)时,需要把TextMode属性设置为Password(如图2),而且要在Page_Load中使用Attributes赋值。protectedvoidPage_Load(objectsender,EventArgse){ReaderPassword.Attributes[“value”]=ReaderPassword.Text;}学习自:https://blog.c

    2022年7月25日
    15
  • 如何升级PowerShell

    如何升级PowerShell

    2021年11月26日
    61

发表回复

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

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