第36课 - 遍历二叉树

1. 什么是遍历

单链表的遍历是指从第一个节点开始(下标为0的结点),按照某种次序一次访问每一个结点。

二叉树的遍历是指从根节点开始,按照某种次序一次访问二叉树中的所有结点。

2. 前序遍历

若二叉树为空:空操作返回。

若二叉树不为空:访问根节点中的数据,前序遍历左子树,前序遍历右子树。

结果:1,2,4,8,9,5,10,3,6,7

3. 中序遍历

若二叉树为空:空操作返回。

若二叉树不为空:中序遍历左子树,访问根节点中的数据,中序遍历右子树。

结果:8,4,9,2,10,5,1,6,3,7

4. 后序遍历

若二叉树为空:空操作返回。

若二叉树不为空:后序遍历左子树,后序遍历右子树,访问根节点中的数据。

结果:8,9,4,10,5,2,6,7,3,1

5. 层次遍历

若二叉树为空:空操作返回。

若二叉树不为空:访问根节点中的数据,访问下一层的结点数据......

6. 程序

main.c     

#include <stdio.h>

#include <stdlib.h>

#include "BTree.h"

#include "LinkQueue.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct Node

{

BTreeNode header;

char v;

};

void printf_data(BTreeNode* node)

{

if( node != NULL )

{

printf("%c", ((struct Node*)node)->v);

}

}

void pre_order_traversal(BTreeNode* root)

{

if( root != NULL )

{

printf("%c, ", ((struct Node*)root)->v);

pre_order_traversal(root->left);

pre_order_traversal(root->right);

}

}

void middle_order_traversal(BTreeNode* root)

{

if( root != NULL )

{

middle_order_traversal(root->left);

printf("%c, ", ((struct Node*)root)->v);

middle_order_traversal(root->right);

}

}

void post_order_traversal(BTreeNode* root)

{

if( root != NULL )

{

post_order_traversal(root->left);

post_order_traversal(root->right);

printf("%c, ", ((struct Node*)root)->v);

}

}

void level_order_traversal(BTreeNode* root)

{

if( root != NULL )

{

LinkQueue* queue = LinkQueue_Create();

if( queue != NULL )

{

LinkQueue_Append(queue, root);

while( LinkQueue_Length(queue) > 0 )

{

struct Node* node = (struct Node*)LinkQueue_Retrieve(queue);

printf("%c, ", node->v);

LinkQueue_Append(queue, node->header.left);

LinkQueue_Append(queue, node->header.right);

}

}

LinkQueue_Destroy(queue);

}

}

int main(int argc, char *argv[])

{

BTree* tree = BTree_Create();

struct Node n1 = {{NULL, NULL}, 'A'};

struct Node n2 = {{NULL, NULL}, 'B'};

struct Node n3 = {{NULL, NULL}, 'C'};

struct Node n4 = {{NULL, NULL}, 'D'};

struct Node n5 = {{NULL, NULL}, 'E'};

struct Node n6 = {{NULL, NULL}, 'F'};

BTree_Insert(tree, (BTreeNode*)&n1, 0, 0, 0);

BTree_Insert(tree, (BTreeNode*)&n2, 0x00, 1, 0);

BTree_Insert(tree, (BTreeNode*)&n3, 0x01, 1, 0);

BTree_Insert(tree, (BTreeNode*)&n4, 0x00, 2, 0);

BTree_Insert(tree, (BTreeNode*)&n5, 0x02, 2, 0);

BTree_Insert(tree, (BTreeNode*)&n6, 0x02, 3, 0);

printf("Full Tree: \n");

BTree_Display(tree, printf_data, 4, '-');

printf("Pre Order Traversal:\n");

pre_order_traversal(BTree_Root(tree));

printf("\n");

printf("Middle Order Traversal:\n");

middle_order_traversal(BTree_Root(tree));

printf("\n");

printf("Post Order Traversal:\n");

post_order_traversal(BTree_Root(tree));

printf("\n");

printf("Level Order Traversal:\n");

level_order_traversal(BTree_Root(tree));

printf("\n");

BTree_Destroy(tree);

return 0;

}

BTree.h

BTree.c

LinkQueue.h

#ifndef _LINKQUEUE_H_

#define _LINKQUEUE_H_

typedef void LinkQueue;

LinkQueue* LinkQueue_Create();

void LinkQueue_Destroy(LinkQueue* queue);

void LinkQueue_Clear(LinkQueue* queue);

int LinkQueue_Append(LinkQueue* queue, void* item);

void* LinkQueue_Retrieve(LinkQueue* queue);

void* LinkQueue_Header(LinkQueue* queue);

int LinkQueue_Length(LinkQueue* queue);

#endif

LinkQueue.c

#include <malloc.h>

#include <stdio.h>

#include "LinkQueue.h"

typedef struct _tag_LinkQueueNode TLinkQueueNode;

struct _tag_LinkQueueNode

{

TLinkQueueNode* next;

void* item;

};

typedef struct _tag_LinkQueue

{

TLinkQueueNode* front;

TLinkQueueNode* rear;

int length;

} TLinkQueue;

LinkQueue* LinkQueue_Create() // O(1)

{

TLinkQueue* ret = (TLinkQueue*)malloc(sizeof(TLinkQueue));

if( ret != NULL )

{

ret->front = NULL;

ret->rear = NULL;

ret->length = 0;

}

return ret;

}

void LinkQueue_Destroy(LinkQueue* queue) // O(n)

{

LinkQueue_Clear(queue);

free(queue);

}

void LinkQueue_Clear(LinkQueue* queue) // O(n)

{

while( LinkQueue_Length(queue) > 0 )

{

LinkQueue_Retrieve(queue);

}

}

int LinkQueue_Append(LinkQueue* queue, void* item) // O(1)

{

TLinkQueue* sQueue = (TLinkQueue*)queue;

TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));

int ret = (sQueue != NULL ) && (item != NULL) && (node != NULL);

if( ret )

{

node->item = item;

if( sQueue->length > 0 )

{

sQueue->rear->next = node;

sQueue->rear = node;

node->next = NULL;

}

else

{

sQueue->front = node;

sQueue->rear = node;

node->next = NULL;

}

sQueue->length++;

}

if( !ret )

{

free(node);

}

return ret;

}

void* LinkQueue_Retrieve(LinkQueue* queue) // O(1)

{

TLinkQueue* sQueue = (TLinkQueue*)queue;

TLinkQueueNode* node = NULL;

void* ret = NULL;

if( (sQueue != NULL) && (sQueue->length > 0) )

{

node = sQueue->front;

sQueue->front = node->next;

ret = node->item;

free(node);

sQueue->length--;

if( sQueue->length == 0 )

{

sQueue->front = NULL;

sQueue->rear = NULL;

}

}

return ret;

}

void* LinkQueue_Header(LinkQueue* queue) // O(1)

{

TLinkQueue* sQueue = (TLinkQueue*)queue;

void* ret = NULL;

if( (sQueue != NULL) && (sQueue->length > 0) )

{

ret = sQueue->front->item;

}

return ret;

}

int LinkQueue_Length(LinkQueue* queue) // O(1)

{

TLinkQueue* sQueue = (TLinkQueue*)queue;

int ret = -1;

if( sQueue != NULL )

{

ret = sQueue->length;

}

return ret;

}

小结:

二叉树仅仅比单链表多了一个指针域,但其遍历算法的种类取增加了很多。

递归定义的数据结构采用递归的算法进行遍历往往能达到简单可靠的效果。

转载于:https://www.cnblogs.com/free-1122/p/11336050.html

数据--第36课 - 遍历二叉树相关推荐

  1. 数据结构之遍历二叉树

    遍历二叉树 在二叉树的一些应用中,常常要求在树中查找具有某种特征的结点.这就提出遍历二叉树的问题,即如何按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次.遍历对线性结构来说, ...

  2. java中怎样存储遍历的数据_【数据算法】Java实现二叉树存储以及遍历

    二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过Linke ...

  3. 【数据算法】Java实现二叉树存储以及遍历

    二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过Linke ...

  4. 数据结构层次遍历二叉树

    2022.11.19 计算二叉树的深度和节点个数 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树. 相关知识 为了完成本关任务, ...

  5. 【数据结构】——构建二叉树,遍历二叉树

    二叉树的数据结构: 1 typedef struct BiTree{ 2 char item; 3 struct BiTree *lchild,*rchild; 4 }BiTree; 构建一个二叉树: ...

  6. java创建二叉树并递归遍历二叉树

    二叉树类代码: package binarytree;import linkqueue.LinkQueue;public class BinaryTree {class Node{public Obj ...

  7. 遍历二叉树的各种操作(非递归遍历)

    先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组 ...

  8. 程序基本功之遍历二叉树

    最近工作忙,没时间思考复杂的问题了.正好要招人就得有面试的嘛,自己也温习一下,要不然怎么去问别人. 今天复习一下二叉树的遍历,前序(pre-order,NLR).中序(in-order,LNR).后序 ...

  9. sdut 3341数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536K Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如 ...

  10. 广度优先遍历二叉树(BFS)-C++实现

    1 // 广度优先遍历二叉树(BFS).cpp: 定义控制台应用程序的入口点.2 //3 4 #include "stdafx.h"5 6 7 #include <iostr ...

最新文章

  1. 【机器学习】Pandas练习题-提高你的数据分析技能
  2. 10-异步爬虫(线程池/asyncio协程)实战案例
  3. 拉普拉斯分布_中心极限定理:从高尔顿板到麦克斯韦分布
  4. C#(Sharp)进阶篇:文件操作
  5. Redis入门(二)之数据类型
  6. 层内容被FLASH遮挡解决办法
  7. Qt翻译文件(.ts)的使用
  8. 第七版(谢希仁)计算机网络 知识点总结
  9. RadASM配色方案工具fix
  10. 新元宇宙奇科幻小说原创作品每周连载地球人奇游天球记第八回邂逅嫦娥
  11. 廊坊金彩教育:拼多多运营方案
  12. 安卓手机格式化后怎么恢复
  13. 视频教程-Echarts+Asp.Net+Sql Server报表开发视频教程-.NET
  14. 自从用了企业微信,彻底摆脱表格写工作周报
  15. PID控制器——MATLAB/Simulink仿真以及性能比较与分析
  16. AutoFIS阅读总结
  17. 抖音的配音段子在哪里搜到,抖音上录段子的配音都在哪里能找到
  18. Python之tkinter 组合框 Combobox
  19. windows系统中创建以 点 .开头的文件及文件夹的方法
  20. VirtualBox虚拟机读取U盘

热门文章

  1. 查找算法---二分查找(递归方式)
  2. 狂神Reids学习笔记二
  3. Android 属性动画简单分析(二)
  4. javascript Prototype constructor的理解(一)
  5. 真正的焦虑感来自对比
  6. getvalue函数怎么使用_单片机基础 —— 使用ADC读取电压值
  7. 蠕虫病毒通过什么侵入计算机系统,注意!蠕虫病毒入侵!我区已有单位个人计算机中招!...
  8. supersocket缓冲区_SuperSocket学习进展
  9. c#web页面显示弹窗_C# .NET弹出窗口
  10. c4d序列号_(图文+视频)野分享:手把手教你免费获取Megascans所有资产并应用于C4D...