按先序序列从键盘输入二叉树,非递归算法实现对二叉树的先序遍历,使用c++实现并给出代码
时间: 2023-05-31 10:07:24 浏览: 138
以下为使用C语言实现二叉树先序遍历的非递归算法代码:
```c
#include <stdio.h>
#define MAX_SIZE 100
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
}TreeNode;
typedef struct Stack {
TreeNode* data[MAX_SIZE];
int top;
}Stack;
void push(Stack* stack, TreeNode* node) {//入栈
stack->top++;
stack->data[stack->top] = node;
}
TreeNode* pop(Stack* stack) {//出栈
if (stack->top == -1) return NULL;
TreeNode* node = stack->data[stack->top];
stack->top--;
return node;
}
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
Stack stack;
stack.top = -1;
push(&stack, root);//根节点入栈
while (stack.top != -1) {//栈不为空则循环
TreeNode* node = pop(&stack);//出栈节点
printf("%d ", node->val);//访问该节点
if (node->right) push(&stack, node->right);//右子节点入栈
if (node->left) push(&stack, node->left);//左子节点入栈,后进先出
}
}
int main() {
//按先序序列输入一棵二叉树,空节点用-1表示
TreeNode nodes[100];//假定最多存储100个节点
int i = 0, j = 0, k = 0;
int data[] = {1, 2, -1, -1, 3, 4, -1, -1, 5, -1, -1};//1表示节点值,-1表示空节点
while (data[i] != -1 && i < 100) {//序列到达尾部或已存满则退出
nodes[i].val = data[i];
nodes[i].left = NULL;
nodes[i].right = NULL;
if (i != 0) {//不是根节点
if (j == 0) {
nodes[k].left = &nodes[i];//该节点是父节点的左子节点
j++;
}
else {
nodes[k].right = &nodes[i];//该节点是父节点的右子节点
j = 0;
k++;//计数器加1,寻找下一个父节点
}
}
i++;//读入下一个节点
}
preorderTraversal(&nodes[0]);//从根节点开始遍历
return 0;
}
```
注意:该代码仅为示例,实际应用中,需要保证输入序列合法、二叉树节点的内存使用正确等问题。
阅读全文