博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【建立二叉树】后序建立二叉树
阅读量:4703 次
发布时间:2019-06-10

本文共 1782 字,大约阅读时间需要 5 分钟。

由后序遍历可知,输入顺序是左结点->右结点->子树根结点

比如输入如下树:

                          a

                       /       \

                     b         c

                   /   

                 d

                     \

                     e

输入序列为 * * * e d * b * * c a $

思路:

使用栈,对左结点和右结点进行压栈;

1.当输入遇到非*,且栈中元素大于等于2,则可以确定一个小三角树形,并将这个树根作为下一个小三角树形的一个子节点;

2.当输入遇到非*,但栈中元素小于2,则直接将此元素压入栈中;

3.当输入遇到*,压入NULL;

4.当输入遇到$,输入结束。

#include 
#include
#include
typedef struct node{ struct node* lc; struct node* rc; int id;}node;typedef struct stack{ node **head; node **top; int max; int used;}stack;#define stack_increasement 20#define stack_initsize 10void init_stack(stack *s){ s->used = 0; s->head = (node**)malloc(sizeof(node*)*stack_initsize); s->top = s->head; s->max = stack_initsize;}void push_stack(stack *s, node* d){ *(s->top++) = d; s->used ++; if(s->used==s->max){ s->max+=stack_increasement; s->head = (node**)realloc(s->head, sizeof(node*)*s->max); s->top = s->head+s->used; }}node* pop_stack(stack *s){ if(s->used==0) return (node*)-1; s->used --; s->top --; return *(s->top);}void bc(node **T){ int input; stack s; node *lctmp, *rctmp; node *temp; init_stack(&s); scanf("%d", &input); while(input!=0){ if(input<0){ push_stack(&s, NULL); } else{ if(s.used>=2){ rctmp = pop_stack(&s); lctmp = pop_stack(&s); temp = (node*)malloc(sizeof(node)); temp->lc = lctmp; temp->rc = rctmp; temp->id = input; push_stack(&s, temp); } else{ temp = (node*)malloc(sizeof(node)); temp->lc = NULL; temp->rc = NULL; temp->id = input; push_stack(&s, temp); } } scanf("%d", &input); } *T = pop_stack(&s);}void pre_visit_tree(node *T){ //递归法 if(T!=NULL){ printf("%d ", T->id); pre_visit_tree(T->lc); pre_visit_tree(T->rc); } else{ return; }}int main(void){ node *tree; bc(&tree); pre_visit_tree(tree); system("pause"); return 0;}

转载于:https://www.cnblogs.com/xhyzjiji/p/6159369.html

你可能感兴趣的文章
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>
中国城市json
查看>>
android下载手动下载Android SDK
查看>>
C++学习:任意合法状态下汉诺塔的移动(原创)
查看>>
leetcode133 - Clone Graph - medium
查看>>
一点小基础
查看>>
UNET学习笔记2 - 高级API(HLAPI)
查看>>