二叉树是一种常见的树状数据结构,它由结点的有限集合组成。一个二叉树要么是空集,被称为空二叉树,要么由一个根结点和两棵不相交的子树组成,分别称为左子树和右子树。每个结点最多有两个子结点,分别称为左子结点和右子结点。

二叉树的顺序存储是指将二叉树中所有结点按层次顺序存放在一块地址连续的存储空间中,详见:
【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)
二叉树的链接存储系指二叉树诸结点被随机存放在内存空间中,结点之间的关系用指针说明。在链式存储中,每个二叉树结点都包含三个域:数据域(Data)、左指针域(Left)和右指针域(Right),用于存储结点的信息和指向子结点的指针,详见:
【数据结构】树与二叉树(六):二叉树的链式存储

【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现)
void inOrderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
// 递归遍历左子树
inOrderTraversal(root->left);
// 访问根节点
printf("%c ", root->data);
// 递归遍历右子树
inOrderTraversal(root->right);
}

NIO算法利用了一个辅助堆栈S来模拟递归过程中的函数调用栈。通过在循环中不断将左子节点入栈,然后处理栈顶节点,并将指针移动到右子节点,实现了中序遍历的非递归算法。
该算法的时间复杂度为O(n),其中n是二叉树中节点的数量。因为每个节点都会被访问一次且入栈一次,所以算法的时间复杂度与节点数量成正比。
这个非递归中序遍历算法可以应用于需要遍历二叉树并按照中序顺序访问节点的场景,例如在构建二叉树的线索化结构时,或者需要按照中序顺序遍历二叉搜索树等情况下。










void nonRecursiveInOrder(struct Node* root) {
struct Node* stack[100]; // 辅助堆栈,用于模拟递归调用栈
int top = -1; // 栈顶指针
struct Node* current = root;
while (current != NULL || top != -1) {
// 将当前结点的左子结点入栈
while (current != NULL) {
stack[++top] = current;
current = current->left;
}
// 弹出栈顶结点,并访问
current = stack[top--];
printf("%c ", current->data);
// 处理右子结点
current = current->right;
}
}
#include
#include
// 二叉树结点的定义
struct Node {
char data;
struct Node* left;
struct Node* right;
};
// 创建新结点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("Memory allocation failed!\n");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 递归中序遍历
void inOrderTraversal(struct Node* root) {
if (root == NULL) {
return;
}
// 递归遍历左子树
inOrderTraversal(root->left);
// 访问根节点
printf("%c ", root->data);
// 递归遍历右子树
inOrderTraversal(root->right);
}
// 非递归中序遍历
void nonRecursiveInOrder(struct Node* root) {
struct Node* stack[100]; // 辅助堆栈,用于模拟递归调用栈
int top = -1; // 栈顶指针
struct Node* current = root;
while (current != NULL || top != -1) {
// 将当前结点的左子结点入栈
while (current != NULL) {
stack[++top] = current;
current = current->left;
}
// 弹出栈顶结点,并访问
current = stack[top--];
printf("%c ", current->data);
// 处理右子结点
current = current->right;
}
}
int main() {
// 创建一棵二叉树
struct Node* root = createNode('a');
root->left = createNode('b');
root->right = createNode('c');
root->left->left = createNode('d');
root->left->right = createNode('e');
root->left->right->left = createNode('f');
root->left->right->right = createNode('g');
// 递归中序遍历二叉树
printf("Recursive In-order traversal: \n");
inOrderTraversal(root);
printf("\n");
// 非递归中序遍历二叉树
printf("Non-recursive In-order traversal:\n");
nonRecursiveInOrder(root);
printf("\n");
return 0;
}
