定义
遍历: 按照某种次序把所有结点都访问一遍
层次遍历: 基于树的层次特性确定的次序规则
递归特征:
①要么是个空二叉树
②要么就是由“根节点+左子树+右子树”组成的二叉树
先序遍历: 根左右(NLR)
中序遍历: 左根右(LNR)
后续遍历: 左右根(LRN)
算数表达式分析树
将操作数作为二叉树的叶子结点,操作符作为二叉树的非叶子结点
graph TD;
A(("-"));
B(("+"));
C(("/"));
D(("a"));
E(("*"));
F(("e"));
G(("f"));
H(("b"));
I(("-"));
J(("c"));
K(("d"));
A-->B;
A-->C;
B-->D;
B-->E;
C-->F;
C-->G;
E-->H;
E-->I;
I-->J;
I-->K;
算数表达式:
a + b * (c - d) - e/f
先序遍历: -+ab-cd/ef
中序遍历: a+bc-d-e/f
后续遍历: abcd-*ef/-
先序遍历->前缀表达式
中序遍历->中缀表达式(要加界限符)
后续遍历->后缀表达式
三种遍历
先序遍历
先序遍历的操作过程如下:
1.若二叉树为空,则什么也不做
2.若二叉树非空:
①访问根节点
②先序遍历左子树
③先序遍历右子树
1 2 3 4 5 6 7 8 9 10 11 12 13
| typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
void PreOrder(BiTree T) { if (T != NULL) { visit(T); PreOrder(T->lchild); PreOrder(T->rchild); } }
|
中序遍历
中序遍历操作过程如下
1.若二叉树为空,则什么也不做
2.若二叉树非空:
②先序遍历左子树
①访问根节点
③先序遍历右子树
1 2 3 4 5 6 7 8 9 10 11 12 13
| typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
void midOrder(BiTree T) { if (T != NULL) { midOrder(T->lchild); visit(T); midOrder(T->rchild); } }
|
后续遍历
后续遍历操作过程如下
1.若二叉树为空,则什么也不做
2.若二叉树非空:
②先序遍历左子树
③先序遍历右子树
①访问根节点
1 2 3 4 5 6 7 8 9 10 11 12 13
| typedef struct BiTNode { ElemType data; struct BiTNode *lchild, *rchild; } BiTNode, *BiTree;
void afterOrder(BiTree T) { if (T != NULL) { afterOrder(T->lchild); afterOrder(T->rchild); visit(T); } }
|
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| #include<stdio.h> #include<stdlib.h> typedef struct BiTNode { char data; struct BiTNode *left, *right; }BiTNode, *BiTree;
bool addLeftChild(BiTree root, char leftData) { BiTree leftNode = (BiTree)malloc(sizeof(BiTNode)); leftNode->data = leftData; leftNode->left = NULL; leftNode->right = NULL; root->left = leftNode; return true; }
bool addRightChild(BiTree root, char rightData) { BiTree rightNode = (BiTree)malloc(sizeof(BiTNode)); rightNode->data = rightData; rightNode->left = NULL; rightNode->right = NULL; root->right = rightNode; return true; }
void visit(BiTree root) { printf("%c ", root->data); }
void preOrder(BiTree root) { if (root != NULL) { visit(root); preOrder(root->left); preOrder(root->right); } }
void midOrder(BiTree root) { if (root != NULL) { midOrder(root->left); visit(root); midOrder(root->right); } }
void afterOrder(BiTree root) { if (root != NULL) { afterOrder(root->left); afterOrder(root->right); visit(root); } }
void deltree(BiTree tree){ if (tree != NULL) { deltree(tree->left); deltree(tree->right); free(tree); } }
int main() { BiTree root; root = (BiTree)malloc(sizeof(BiTNode)); root->data = 'A'; addLeftChild(root, 'B'); addRightChild(root, 'C'); addLeftChild(root->left, 'D'); addRightChild(root->left, 'E'); addLeftChild(root->right, 'F'); addRightChild(root->right, 'G'); printf("\n前序遍历:"); preOrder(root); printf("\n中序遍历:"); midOrder(root); printf("\n后序遍历:"); afterOrder(root); deltree(root); return 0; }
|