中序和先序非递归建立二叉树程序代码c语言
时间: 2023-08-30 07:06:37 浏览: 109
下面是中序和先序非递归建立二叉树的程序代码示例,以C语言为例:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 创建节点函数
struct TreeNode* createNode(int val) {
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 中序和先序非递归建立二叉树函数
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
if (preorderSize == 0 || inorderSize == 0)
return NULL;
struct TreeNode* root = createNode(preorder[0]);
struct TreeNode* cur = root;
int preIndex = 1, inIndex = 0;
int flag = 0;
struct TreeNode* stack[1000];
int top = -1;
stack[++top] = cur;
while (preIndex < preorderSize) {
if (top >= 0 && stack[top]->val == inorder[inIndex]) {
cur = stack[top];
top--;
inIndex++;
flag = 1;
} else {
if (flag == 0) {
cur->left = createNode(preorder[preIndex]);
cur = cur->left;
stack[++top] = cur;
preIndex++;
} else {
flag = 0;
cur->right = createNode(preorder[preIndex]);
cur = cur->right;
stack[++top] = cur;
preIndex++;
}
}
}
return root;
}
// 中序遍历函数
void inorderTraversal(struct TreeNode* root) {
if (root == NULL)
return;
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
// 先序遍历函数
void preorderTraversal(struct TreeNode* root) {
if (root == NULL)
return;
printf("%d ", root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
int preorder[6] = {1, 2, 4, 5, 3, 6};
int inorder[6] = {4, 2, 5, 1, 3, 6};
struct TreeNode* root = buildTree(preorder, 6, inorder, 6);
printf("Inorder traversal: ");
inorderTraversal(root);
printf("\n");
printf("Preorder traversal: ");
preorderTraversal(root);
printf("\n");
return 0;
}
```
该程序中,我们使用了一个栈来辅助建立二叉树。在建立二叉树时,我们首先创建根节点,并将其入栈。然后,我们遍历先序遍历序列中的所有节点,对于每个节点,如果其值与栈顶节点的值不相等,则将该节点作为栈顶节点的左子树,并将该节点入栈;否则,我们弹出栈顶节点,并将该节点作为栈顶节点的右子树。最后,我们返回根节点,即可得到建立好的二叉树。
在程序中,我们还提供了中序遍历和先序遍历函数,用于验证建立的二叉树是否正确。
阅读全文