提到二叉树我首先想到的是它的三种遍历方式:先序、中序和后序。
从下边这个最简单的二叉树入手介绍:
1、先、中、后指的是根节点的位置;
2、先序是:根 左子树 右子树;
3、中序是:左子树 根 右子树;
4、后序是:左子树 右子树 根;
先序:A B C
中序:B A C
后序:B C A
先、中、后序遍历下面二叉树
先序:ABDECFGH
中序:DBEAHGFC
后序:DEBHGFCA
C语言实现二叉树基本操作
- 二叉树节点的定义
typedef struct binary_tree{ int data; /* data */ struct binary_tree *left; /*left children */ struct binary_tree *right; /*right children */ }Node; typedef struct{ Node *root; }Tree;
-
二叉树的创建
void Insert(int c, Tree *T) { Node *node = malloc(sizeof(Node)); node->data = c; node->left = NULL; node->right = NULL; if(T->root == NULL) { T->root = node; } else { Node *temp = T->root; while(temp != NULL) { if(node->data < temp->data) //小于当前节点放在左边 { if(temp->left == NULL) { temp->left = node; return; } else { temp = temp->left; } } else { if(temp->right == NULL) { temp->right = node; return; } else { temp = temp->right; } } } } }
-
二叉树的先序遍历(递归方法实现)
void PreOrder(Node *node) { if(NULL != node) { printf("%d ", node->data); PreOrder(node->left); PreOrder(node->right); } }
-
二叉树的中序遍历(递归方法实现)
void InOrder(Node *node) { if(NULL != node) { InOrder(node->left); printf("%d ", node->data); InOrder(node->right); } }
-
二叉树的中序遍历(栈方法实现)
void InOrder_Stack(Tree *tree, int stack_Size) { Node *temp_array[stack_Size];//定义一个顺序存储数组用作栈 Node *temp_node = tree->root;//定义一个节点指针指向树根 int i = -1;//记录此时栈中节点个数 if(temp_node != NULL) { while(i > -1 || temp_node != NULL) { while(temp_node != NULL) //入栈 { i++; temp_array[i] = temp_node; temp_node = temp_node->left; } if(i > -1) { temp_node = temp_array[i]; printf("%d ", temp_node->data); i--; temp_node = temp_node->right; } } } }
-
二叉树的后序遍历(递归方法实现)
void PostOrder(Node *node) { if(NULL != node) { PostOrder(node->left); PostOrder(node->right); printf("%d ", node->data); } }