非递归建立二叉树 c

本文介绍了如何使用C语言非递归地创建二叉树。通过压栈和出栈操作,根据给定的字符序列构建二叉树。代码中包含了新建节点、前序遍历以及一个简单的示例输入,帮助理解创建过程。

1. 非递归建立二叉树 c

建立过程如下图所示:

插入左子树时压栈,插入右子树时出栈

下面是中序和先序非递归建立二叉树的程序代码示例,以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; } ``` 该程序中,我们使用了一个栈来辅助建立二叉树。在建立二叉树时,我们首先创建根节点,并将其入栈。然后,我们遍历先序遍历序列中的所有节点,对于每个节点,如果其值与栈顶节点的值不相等,则将该节点作为栈顶节点的左子树,并将该节点入栈;否则,我们弹出栈顶节点,并将该节点作为栈顶节点的右子树。最后,我们返回根节点,即可得到建立好的二叉树。 在程序中,我们还提供了中序遍历和先序遍历函数,用于验证建立二叉树是否正确。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值