先序遍历(二叉树按二叉链表方式存储)(icoding

题目

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

void pre_order(BiTree root);

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

void visit_node(BiTNode *node);

二叉树的相关定义如下:

t

ypedef 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

答案

```c
#include "bitree.h" //请不要删除,否则检查不通过
#include 
#include 

void pre_order(BiTree root)
{ //非递归实现
    Stack st;
    init_stack(&st);
    if (root == NULL)
        return;
    push(&st, root);
    while (!is_empty(&st)) {
        BiTNode* node;
        pop(&st, &node);
        visit_node(node);
        if (node->right != NULL)
            push(&st, node->right);
        if (node->left != NULL)
            push(&st, node->left);
    }
}

我的收获

1.通过递归实现考虑非递归实现的细节

void pre_order(BiTree root){//递归实现
if(root!=NULL)
visit_node(root);
pre_order(root->left);
pre_order(root->right);
}

递归实现就是反复调用pre_order函数,因此非递归调用的各个操作也应该能对每一个结点都能执行,实现“反复操作”。
2.指针的使用
Stack st;
init_stack(&st);

指针的本质是地址。
st 是一个结构变量,但是&st就是对st取地址,因此&st就是一个指针。
3.根据函数所设置变量的具体类型,如push(Stack* S,ElemType x)中S、x的类型写出后续的push(&st,node->right)
4.if和while的区别
“if()判断,while()循环,for()循环”
while()、for()执行多次,if()执行一次
5.因为粗心把node全写成root,这种错误就算不调试,肉眼也能判断。

if (node->right != NULL)
            push(&st, node->right);
        if (node->left != NULL)
            push(&st, node->left);

你可能感兴趣的:(先序遍历(二叉树按二叉链表方式存储)(icoding)