二叉树遍历
在数据结构中,二叉树是一种常用且重要的数据结构。二叉树的遍历是指按照一定顺序访问二叉树的所有节点,常见的遍历方式有前序遍历、中序遍历和后序遍历。本文将详细介绍这三种遍历算法,并介绍最优二叉树。
二叉树的基本定义
首先,我们先来了解一下二叉树的基本定义。二叉树是每个节点最多有两个子节点的树结构。每个节点都可以有左子节点和右子节点,也可以没有子节点。二叉树可以为空,即没有任何节点。
1、前序遍历
前序遍历是先访问根节点,然后按照左子树、右子树的顺序递归遍历。前序遍历的访问顺序为"根左右 "。
代码
c
void preOrderTraversal(TreeNode* root) {
if (root == NULL) return;
printf("%c ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
2、中序遍历
中序遍历是先按照左子树的顺序递归遍历,然后访问根节点,最后按照右子树的顺序递归遍历。中序遍历的访问顺序为"左根右 "。
代码
c
void inOrderTraversal(TreeNode* root) {
if (root == NULL) return;
inOrderTraversal(root->left);
printf("%c ", root->data);
inOrderTraversal(root->right);
}
3、后序遍历
后序遍历是先按照左子树、右子树的顺序递归遍历,然后访问根节点。后序遍历的访问顺序为"左右根 "。
代码
c
void postOrderTraversal(TreeNode* root) {
if (root == NULL) return;
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%c ", root->data);
}
全部代码(这里是递归的方式,也可以是用队列或者是栈来实现,但是有点麻烦)
①tree.h
c
#ifndef _TREE_H_
#define _TREE_H_
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
//创建树
TreeNode* createTree();
//先序
void preOrderTraversal(TreeNode* root);
//中序
void inOrderTraversal(TreeNode* root);
//后序
void postOrderTraversal(TreeNode* root);
#endif
②tree.c
c
#include "tree.h"
//创建树
TreeNode* createTree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = ch;
newNode->left = createTree();
newNode->right = createTree();
return newNode;
}
//先序
void preOrderTraversal(TreeNode* root) {
if (root == NULL) return;
printf("%c ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
//中序
void inOrderTraversal(TreeNode* root) {
if (root == NULL) return;
inOrderTraversal(root->left);
printf("%c ", root->data);
inOrderTraversal(root->right);
}
//后序
void postOrderTraversal(TreeNode* root) {
if (root == NULL) return;
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%c ", root->data);
}
③tree_main.c
c
#include "tree.h"
#include "tree.c"
int main() {
printf("输入先序序列(包含null节点,使用#表示):\n");
TreeNode* root = createTree();
printf("构造的二叉树先序遍历结果为:\n");
preOrderTraversal(root);
printf("\n构造的二叉树中序遍历结果为:\n");
inOrderTraversal(root);
printf("\n构造的二叉树后序遍历结果为:\n");
postOrderTraversal(root);
return 0;
}
运行结果
和上面我们画图连线是一样的结果。
1、由先序和中序求后序
先序:A B C E F G H D I J K L M
中序:E C B G F H A J I K D M L
求后序?
2、由后序和中序求先序
中序:E C B G F H A J I K D M L
后序:E C G H F B J K I M L D A
求先序?