博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构 遍历二叉树 8
阅读量:776 次
发布时间:2019-03-24

本文共 2337 字,大约阅读时间需要 7 分钟。

遍历二叉树(Traversing Binary Tree)

相关定义

遍历定义——指按某条搜索路线遍访每个结点且不重复(又称周游)。

遍历用途——它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。  

遍历方法——牢记一种约定,对每个结点的查看都是“先左后右” 。

遍历规则———

(1)二叉树由根、左子树、右子树构成,定义为D、 L、R

(2)D、 L、R的组合定义了六种可能的遍历方案:LDR,   LRD,   DLR,   DRL,   RDL,   RLD

(3)若限定先左后右,则有三种实现方案:DLR  先 (根)序遍历 、LDR   中 (根)序遍历、LRD 后(根)序遍历

:“先、中、后”的意思是指访问的结点D是先于子树出现还是后于子树出现。

例1:

口诀: DLR—先序遍历,即先根再左再右

            LDR—中序遍历,即先左再根再右

            LRD—后序遍历,即先左再右再根

先序遍历的结果是:A B D E C          中序遍历的结果是:D B E A C                后序遍历的结果是:D E B C A

                                                                               

 先序遍历:ABCDEFGH                    中序遍历:BDCEAFHG                     后序遍历:DECBHGFA

 例2:用二叉树表示算术表达式

遍历的算法实现:用递归形式格外简单!

//回忆1:二叉树二叉链表结点的定义:typedef struct node *tree_pointer;typedef struct node {        int data;        tree_pointer  left_child, right_child;} node;

//结点数据类型自定义typedef struct node{   int  data;    struct node lchild,*rchild;} NODE;NODE *root;

先序遍历算法:

DLR(NODE *root ){      if (root) //非空二叉树    {printf(“%d”,root->data); //访问DDLR(root->lchild); //递归遍历左子树DLR(root->rchild); //递归遍历右子树    }}

中序遍历算法:

LDR(NODE *root){ if(root !=NULL)  {  LDR(root->lchild);      printf(“%d”,root->data);      LDR(root->rchild);   } }

后序遍历算法:

LRD (NODE *root){if(root !=NULL)    {LRD(root->lchild);     LRD(root->rchild);     printf(“%d”,root->data);    } }
#include
#include
#include
/*typedef struct BiTNode{int date;struct BiTNode* lchild,* rchild;}BiTNode,*BiTree;*///二叉链表示法struct BiTNode{ int date; struct BiTNode* lchild, *rchild;}BiTNode, *BiTree;typedef struct BiTNode BiTNode;typedef struct BiTNode *BiTree;void preOrder(BiTNode* root){ if (root == NULL) { return; } printf("%d", root->data); //遍历左子树 preOrder(root->lchild); //遍历右子树 preOrder(root->rchild);}void inOrder(BiTNode* root){ if (root == NULL) { return; } //遍历左子树 inOrder(root->lchild); printf("%d", root->data); //遍历右子树 inOrder(root->rchild);}void postOrder(BiTNode* root){ //遍历左子树 postOrder(root->lchild); //遍历右子树 postOrder(root->rchild); printf("%d", root->data);}void main(){ BiTNode t1, t2, t3, t4, t5; memset(&t1, 0, sizeof(BiTNode)); memset(&t2, 0, sizeof(BiTNode)); memset(&t3, 0, sizeof(BiTNode)); memset(&t4, 0, sizeof(BiTNode)); memset(&t5, 0, sizeof(BiTNode)); t1.data = 1; t2.data = 2; t3.data = 3; t4.data = 4; t5.data = 5; //建立关系 t1.lchild = &t2; t1.rchild = &t3; t2.lchild = &t4; t3.lchild = &t5; //树的遍历 printf("preOrder\n"); preOrder(&t1); printf("inOrder\n"); inOrder(&t1); printf("postOrder\n"); postOrder(&t1); return;}

 

转载地址:http://mzqkk.baihongyu.com/

你可能感兴趣的文章