Icoding题解
题干
先序遍历
已知二叉树按照二叉链表方式存储,利用栈的基本操作写出先序遍历非递归形式的算法:
void pre_order(BiTree root);
在遍历过程中,pre_order函数需要调用 visit_node 函数来实现对结点的访问,该函数声明如下:
void visit_node(BiTNode *node);
二叉树的相关定义如下:
1 2 3 4 5 6 7
| typedef int DataType;
typedef struct Node{ DataType data; struct Node* left; struct Node* right; }BiTNode, *BiTree;
|
遍历所使用栈的相关操作如下:
1 2 3 4 5 6 7 8 9 10 11 12
| #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); bool pop(Stack* S, ElemType *px); bool top(Stack* S, ElemType *px); bool is_empty(Stack* S);
|
分析
简要分析题干:
利用栈进行非递归的先序遍历。
应当注意的问题:
- 先序遍历:先访问根结点,再访问左子树,最后访问右子树
- 非递归的先序遍历方法
- 栈的基本操作
- 树的基本概念与基本操作
解题思路:
- 一直对左结点向下访问
- 每次访问都将结点存到栈中
- 一旦指针指向为空,就出栈元素,访问其右结点
注释代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| void pre_order(BiTree root) { if (root == NULL) return; Stack S; init_stack(&S);
BiTree CurrNode = root; while (CurrNode != NULL || !is_empty(&S)) { if (CurrNode != NULL) { visit_node(CurrNode); push(&S, CurrNode); CurrNode = CurrNode->left; } else { pop(&S, &CurrNode); CurrNode = CurrNode->right; } } }
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| void pre_order(BiTree root){ Stack S; init_stack(&S); while(root != NULL || !is_empty(&S)) { if(root != NULL) { visit_node(root); push(&S, root); root = root->left; } else { pop(&S, &root); root = root->right; } } }
|