数据结构 07 - 二叉树的遍历

  树是由m(m>=0)个结点组成的有序集合,而二叉树的结点的子节点应该为n(n<=2),且严格区分左孩子结点和右孩子结点。
下面为二叉树的链式存储以及二叉树的4种遍历方式。

设有如下二叉树:
				A					先序遍历: ABCDEFGHK
			   / \					中序遍历: BDCAEHGKF
	   		  B    E				后序遍历: DCBHKGFEA
			   \    \				层次遍历: ABECFDGHK
			    C    F
			   /    /
			  D    G
			      / \
			     H   K

C语言代码实现:
采用链式存储,递归存入的方式创建二叉树,以’#'表示空结点,运行结果如下:
在这里插入图片描述
实现代码:

/*
tree.c
*/
#include "tree.h"
T_node *create_tree() //创建二叉树
{
    char c;
    if((c = getchar()) != '#'){
        T_node *root = (T_node *)malloc(sizeof(T_node));
        if(NULL == root){//申请空间失败
            printf("malloc failed!\n");
            return NULL;
        }
        
        root->data = c;
        root->l_child = create_tree();//递归创建左孩子节点
        root->r_child = create_tree();//递归创建右孩子节点

        return root;
    }
    else{
        return NULL;
    }
}

//先序遍历
void pre_traversal(T_node *tree)
{
    if(!tree){
        return;
    }
    else{
        printf("%c ",tree->data);
        pre_traversal(tree->l_child);
        pre_traversal(tree->r_child);
    }
}

//中序遍历
void mid_traversal(T_node *tree)
{
    if(!tree){
        return;
    }
    else{
        mid_traversal(tree->l_child);
        printf("%c ",tree->data);
        mid_traversal(tree->r_child);
    }
}
//后序遍历
void pos_traversal(T_node *tree)
{
    if(!tree){
        return;
    }
    else{
        pos_traversal(tree->l_child);
        pos_traversal(tree->r_child);
        printf("%c ",tree->data);
    }
}

//层次遍历
void lev_traversal(T_node *tree)
{
    if(tree == NULL) return;    //空树返回
    T_node *p,*t[32] = {0};
    int front,rear;     //头尾‘指针’
    front = rear = 1;   //下标从1开始
    t[rear] = tree;

    while(t[front] != NULL){
        printf("%c ",t[front]->data);

        p = t[front];

        if(p->l_child != NULL){
            t[++rear] = p->l_child;
        }
        
        if(p->r_child != NULL){
            t[++rear] = p->r_child;
        }
        front++; 
    }
}
/*
main.c
*/
#include "tree.h"
int main()
{
    T_node *t = create_tree();

    printf("先序遍历:");
    pre_traversal(t);
    puts("");

    printf("中序遍历:");
    mid_traversal(t);
    puts("");

    printf("后序遍历:");
    pos_traversal(t);
    puts("");

    printf("层次遍历:");
    lev_traversal(t);
    puts("");

    return 0;
}
/*
tree.h
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef __TREE__
#define __TREE__

typedef int data_t;
typedef struct tree_node{
    data_t data;				//数据域
    struct tree_node *l_child;	//指向左孩子节点
	struct tree_node *r_child;  //指向右孩子节点
}T_node;

//创建树
T_node *create_tree();
//先序遍历
void pre_traversal(T_node *tree);
//中序遍历
void mid_traversal(T_node *tree);
//后序遍历
void pos_traversal(T_node *tree);
//层次遍历
void lev_traversal(T_node *tree);
#endif
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值