后序拓展序列与相关(基于链表实现)

    xiaoxiao2021-04-14  92

    序: 构造出一棵二叉树的方法有很多,基于*序拓展序列也可以构造出亦可唯一的一棵二叉树,本文给出基于后序拓展序列生成二叉树(基于链表实现)。


    何谓后续拓展序列? 后续拓展序列指在二叉树的后续遍历序列中增加空节点的序号。

    Input

    一行字符,即扩展后序序列

    Output

    输出对应的前序遍历结果

    思路: 通过栈来实现。 从字符串头开始,如果是空节点进栈,否则就是非空节点,将最后两个提出,与该节点建立关系(根左右),再将该节点入栈。走完整个字符串,最后整棵二叉树便建成了。

    原因: 由于加入了空序号,那么这棵二叉树是一棵完全二叉树。那么后续序列一定严格满足左右根的顺序,并且在同一级。


    源代码:

    /* About: binary tree-postorder Auther: kongse_qi Date:2017/03/15 */ #include <iostream> #include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> using namespace std; const int maxn = 10005; typedef struct qi_{ char x; struct qi_ *left, *right; }qi;//二叉树的组成 char a[maxn]; qi *x[maxn]; int end; inline qi *build(char a)//建树 { qi *curr = (qi*)malloc(sizeof(qi)); curr -> x = a; curr -> left = NULL; curr -> right = NULL; return curr; } inline qi* to(qi* a, qi* b, qi* c)//标记出关系 { c -> left = a; c -> right = b; return c; } void search(qi* curr)//输出 { if(curr -> x != '.') cout << curr->x; if(curr -> left != NULL) search(curr -> left); if(curr -> right != NULL) search(curr -> right); return ; } int main() { //freopen("test.in", "r", stdin); scanf("%s", a); for(int i = 0; i != strlen(a); ++i) { if(isalpha(a[i])) { x[end++] = build(a[i]); x[end-3] = to(x[end-3],x[end-2], x[end-1]); end = end-2; } else x[end++] = build('.'); } search(x[end-1]); return 0; }

    拓展: 求某节点与根节点的距离: 只需要将输出函数修改一下:

    void search(qi* curr) { ++ans;//向下一层 if(curr -> x == xx) cout << ans-1, exit(0);//xx即询问的节点 if(curr -> left != NULL) search(curr -> left); if(curr -> right != NULL) search(curr -> right); --ans;//返回上一层 return ; }

    备注: 链表建树会比直接使用数组要慢。用数组分别存左右孩子的节点,思路与链表相同,只是写法稍有区别,故不给出代码。

    自此完成。 箜瑟_qi 2017.04.13 21:22

    转载请注明原文地址: https://ju.6miu.com/read-670001.html

    最新回复(0)