C语言数据结构-树和二叉树-先序遍历-已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法

先序遍历

已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法:

void pre_order(BiTree root);

在遍历过程中,pre_order函数需要调用 visit_node 函数来实现对结点的访问,该函数声明如下:

void visit_node(BiTNode *node);

二叉树的相关定义如下:

typedef int DataType;

typedef struct Node{
    DataType data;
    struct Node* left;
    struct Node* right;
}BiTNode, *BiTree;

遍历所使用栈的相关操作如下:

#define Stack_Size 50
typedef BiTNode* ElemType;
typedef struct{
    ElemType elem[Stack_Size];
    int top;
}Stack;

void init_stack(Stack *S); // 初始化栈
bool push(Stack* S, ElemType x); //x 入栈
bool pop(Stack* S, ElemType *px); //出栈,元素保存到px所指的单元,函数返回true,栈为空时返回 false
bool top(Stack* S, ElemType *px); //获取栈顶元素,将其保存到px所指的单元,函数返回true,栈满时返回 false
bool is_empty(Stack* S);  // 栈为空时返回 true,否则返回 false

提供代码

#include <stdlib.h>
#include <stdio.h>
#include "bitree.h" //请不要删除,否则检查不通过

void pre_order(BiTree root){


}

参考代码

#include "bitree.h" //请不要删除,否则检查不通过
#include <stdio.h>
#include <stdlib.h>

void pre_order(BiTree root)
{
    Stack S[Stack_Size];
    BiTree T = root;
    init_stack(S);
    while (T || !is_empty(S)) 
    {
        while (T)
        {
            visit_node(T);
            push(S, T);
            T = T->left;
        }
        pop(S, &T);
        T = T->right;
    }
}

 

 

 

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会帮你解决这个问题。这道题需要使用递归的方法来构建二叉树。首先,我们需要明确的是,先序遍历的第一个结点一定是二叉树的根节点。我们可以根据这个特性,将中序遍历序列分成左右两个子序列,左边的子序列是根节点的左子的中序遍历序列,右边的子序列是根节点的右子的中序遍历序列。然后,根据左右子序列的长度,我们可以在先序遍历序列中找到根节点的左子和右子先序遍历序列。接下来,我们递归地构建左子和右子。 下面是实现这个算法的 C 代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct node { char data; struct node *left; struct node *right; } Node; // 根据先序遍历序列和中序遍历序列构建二叉树 Node* buildTree(char *preorder, char *inorder, int len) { if (len == 0) { return NULL; } // 先序遍历的第一个结点是根节点 char rootValue = preorder[0]; Node *root = (Node*)malloc(sizeof(Node)); root->data = rootValue; root->left = NULL; root->right = NULL; // 在中序遍历序列中找到根节点 int rootIndex = 0; while (rootIndex < len && inorder[rootIndex] != rootValue) { rootIndex++; } // 构建左子 root->left = buildTree(preorder + 1, inorder, rootIndex); // 构建右子 root->right = buildTree(preorder + rootIndex + 1, inorder + rootIndex + 1, len - rootIndex - 1); return root; } // 打印二叉树 void printTree(Node *root, int level) { if (root == NULL) { return; } printTree(root->right, level + 1); for (int i = 0; i < level; i++) { printf(" "); } printf("%c\n", root->data); printTree(root->left, level + 1); } int main() { char preorder[] = {'A', 'B', 'D', 'E', 'C', 'F'}; char inorder[] = {'D', 'B', 'E', 'A', 'F', 'C'}; int len = sizeof(preorder) / sizeof(preorder[0]); Node *root = buildTree(preorder, inorder, len); printTree(root, 0); return 0; } ``` 这段代码首先定义了二叉树节点的结构体,然后实现了 `buildTree` 函数来构建二叉树。这个函数接受三个参数:先序遍历序列、中序遍历序列和序列的长度。在函数中,首先判断序列长度是否为 0,如果是,则返回 `NULL`。否则,取出先序遍历的第一个结点作为根节点,然后在中序遍历序列中找到根节点的位置,将中序遍历序列分成左右两个子序列。根据左右子序列的长度,可以在先序遍历序列中找到根节点的左子和右子的序列,然后递归地构建左子和右子。 最后,打印二叉树的函数 `printTree` 接受两个参数:根节点和当前节点的层数。这个函数使用递归的方式,先打印右子,然后打印当前节点,并打印若干个空格,以便让当前节点的位置对齐。最后打印左子。 希望这个代码可以帮助你完成这道题目。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值