在计算机科学中,二叉树是一种极为重要的数据结构,广泛应用于各种算法和程序中。它是一种每个节点最多有两个子节点的树结构,通常子节点被称作“左子节点”和“右子节点”。通过这篇文章,我们将深入探讨如何在C语言中构建二叉树,并介绍三种基本的遍历方法:先序遍历、中序遍历和后序遍历。我们不仅会介绍这些遍历方法的递归实现,还会探讨非递归(使用堆栈)的实现方式。
二叉树的构建
二叉树的构建基于给定的先序遍历和中序遍历序列。通过这两个序列,我们可以唯一确定一棵二叉树的结构。构建过程中的关键是找到中序遍历中根节点的位置,这样可以划分左子树和右子树,然后递归地对左右子树进行同样的构建过程。
构建函数create
接收先序遍历和中序遍历的序列以及序列的长度,然后递归地构建出二叉树。首先,它创建一个新节点作为根节点,节点的数据是先序遍历的第一个元素。然后,它在中序遍历序列中找到该元素,以确定左子树和右子树的边界。最后,函数递归地为左子树和右子树调用自身。
二叉树的递归遍历
遍历二叉树是指按照某种顺序访问树中的每个节点,确保每个节点被访问一次。这里介绍三种基本的遍历方法:
- 先序遍历(根-左-右):先访问根节点,然后递归地遍历左子树,最后遍历右子树。
- 中序遍历(左-根-右):先递归地遍历左子树,然后访问根节点,最后遍历右子树。对于二叉搜索树,这种遍历方式会按照升序访问所有节点。
- 后序遍历(左-右-根):先递归地遍历左子树,然后是右子树,最后访问根节点。
递归实现简单直观,但是也容易造成栈溢出。因此,对于深度很大的二叉树,非递归实现(使用堆栈)是更健壮的选择。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义二叉树节点类型
typedef struct bnode {
char data;
struct bnode *lc, *rc;
} bnode_type;
bnode_type* create(char preorder[], char inorder[], int length) {
if(length == 0) {
return NULL;
}
bnode_type* root = (bnode_type*)malloc(sizeof(bnode_type));
root->data = preorder[0];
int rootPosition = 0;
for(; rootPosition < length; ++rootPosition) {
if(inorder[rootPosition] == preorder[0]) {
break;
}
}
root->lc = cr