王道oj/problem21
网址:oj.lgwenda.problem/21
思路:先序遍历,中序遍历,后序遍历用递归实现;层序遍历用一个链队实现,出队一个元素,顺序入队他的左孩子和右孩子
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef char BiElemType;
typedef struct BiTNode
{
BiElemType c=0;
struct BiTNode* lchild=NULL;
struct BiTNode* rchild=NULL;
}BiTNode,*BiTree;
typedef BiTree ElemType;
typedef struct tag {
BiTree p;//树的某一个结点的地址值
struct tag* pnext=NULL;
}tag_t, * ptag_t;
typedef struct LinkNode {
ElemType data;
struct LinkNode* next;
}LinkNode;
typedef struct{
LinkNode* front, * rear;
}LinkQueue;
void InitQueue(LinkQueue& Q)
{
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
bool IsEmpty(LinkQueue Q)
{
if (Q.front == Q.rear)
return true;
else
return false;
}
void EnQueue(LinkQueue& Q, ElemType x)
{
LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
Q.rear->next = s;
Q.rear = s;
Q.rear->next = NULL;
}
bool DeQueue(LinkQueue& Q, ElemType& x)
{
if (Q.rear == Q.front)return false;
LinkNode* p = Q.front->next;
x = p->data;
Q.front->next = p->next;
if (p == Q.rear)
Q.rear = Q.front;
free(p);
return true;
}
void preOrder(BiTree p)
{
if (p != NULL)
{
putchar(p->c);
preOrder(p->lchild);
preOrder(p->rchild);
}
}
void InOrder(BiTree p)
{
if (p != NULL)
{
InOrder(p->lchild);
putchar(p->c);
InOrder(p->rchild);
}
}
void AfterOrder(BiTree p)
{
if (p != NULL)
{
AfterOrder(p->lchild);
AfterOrder(p->rchild);
putchar(p->c);
}
}
void LevelOrder(BiTree T)
{
LinkQueue Q;
InitQueue(Q);
BiTree p;
EnQueue(Q, T);
while (!IsEmpty(Q))
{
DeQueue(Q, p);
putchar(p->c);
if (p->lchild != NULL)
EnQueue(Q, p->lchild);
if (p->rchild != NULL)
EnQueue(Q, p->rchild);
}
}
int main()
{
BiTree pnew=NULL;
int i, j, pos;
char c;
BiTree tree = NULL;
ptag_t phead = NULL, ptail = NULL, listpnew=NULL,pcur=NULL;//phead就是队列头,ptail就是队列尾
while (scanf("%c", &c) != EOF)
{
if (c == '\n')
{
break;
}
pnew = (BiTree)calloc(1,sizeof(BiTNode));//calloc申请空间并对空间进行初始化,赋值为0
pnew->c = c;//数据放进去
listpnew = (ptag_t)calloc(1,sizeof(tag_t));//给队列节点申请空间
listpnew->p = pnew;
if (NULL == tree)
{
tree = pnew;
phead = listpnew;
ptail = listpnew;
pcur = listpnew;
continue;
}else {
ptail->pnext = listpnew;//新结点放入链表,通过尾插法
ptail = listpnew;//ptail指向队列尾部
}//pcur始终指向要插入的结点的位置
if (NULL == pcur->p->lchild)//如何把新结点放入树
{
pcur->p->lchild = pnew;//把新结点放到要插入结点的左边
}else if(pcur->p->rchild==NULL){
pcur->p->rchild = pnew;
pcur = pcur->pnext;//左右都放了结点,指向下一个
}
}
//printf("----------以下是前序遍历-----------\n");
//preOrder(tree);
InOrder(tree);
printf("\n");
AfterOrder(tree);
printf("\n");
LevelOrder(tree);
}
王道oj/problem21的更多相关文章
- Online Judge(OJ)搭建(第一版)
搭建 OJ 需要的知识(重要性排序): Java SE(Basic Knowledge, String, FileWriter, JavaCompiler, URLClassLoader, Secur ...
- [C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ
前言 做过杭电.浙大或是北大等ACM题库的人一定对“刷题”不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到“Online Exercise”下的 ...
- oj Rapid Typing
import bs4 import requests import urllib2 import time import base64 session=requests.Session() respo ...
- 在线OJ实用技巧(转载)
1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下 ...
- OJ生成器(一)制作Online Judge前的准备和策划
我这校区新的微机老师斗志昂扬,准备让我们这学校萎靡的信息技术竞赛重振雄风.然后有一次我半开玩笑地说建一个自己的OJ吧,老师也就鼓励我去做了. 开什么玩笑……!我可是马上要参加NOIP的人! 于是老师说 ...
- 【LeetCode OJ】Validate Binary Search Tree
Problem Link: https://oj.leetcode.com/problems/validate-binary-search-tree/ We inorder-traverse the ...
- 【LeetCode OJ】Recover Binary Search Tree
Problem Link: https://oj.leetcode.com/problems/recover-binary-search-tree/ We know that the inorder ...
- 【LeetCode OJ】Same Tree
Problem Link: https://oj.leetcode.com/problems/same-tree/ The following recursive version is accepte ...
- 【LeetCode OJ】Symmetric Tree
Problem Link: https://oj.leetcode.com/problems/symmetric-tree/ To solve the problem, we can traverse ...
- 【LeetCode OJ】Binary Tree Level Order Traversal
Problem Link: https://oj.leetcode.com/problems/binary-tree-level-order-traversal/ Traverse the tree ...
随机推荐
- 2021-02-05:给定一个数N,想象只由0和1两种字符,组成的所有长度为N的字符串。如果某个字符串,任何0字符的左边都有1紧挨着,认为这个字符串达标。请问有多少达标的字符串?
2021-02-05:给定一个数N,想象只由0和1两种字符,组成的所有长度为N的字符串.如果某个字符串,任何0字符的左边都有1紧挨着,认为这个字符串达标.请问有多少达标的字符串? 福哥答案2021-0 ...
- 如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队
测试,没有分析与设计就失去了灵魂: 测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在<测试的底层逻辑>中讲到了[输入输出测试模型],还讲到了[2W+1H测试分析法],但2W1H分 ...
- 《Linux的文件目录类指令 20条》
文件目录类的指令 1.pwd指令 查看当前目录 2.ls 指令 查看当前目录所有内容信息 ls -a 显示当前目录所有的文件和目录,包括隐藏的 ls -l 以列表的方式显示信息 ls -al或la ...
- 不要轻易尝试 weexplus open as
昨日使用 weexplust publish android 编译apk, 出现了一大堆错 FAILURE: Build failed with an exception. * What went w ...
- 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Infer ...
- 【python基础】循环语句-break关键字
1.break关键字 break关键字,其作用是在循环中的代码块遇到此关键字,立刻跳出整个循环,执行循环外的下一条语句. 其在while和for循环中的作用示意图如下: 1.1break在while循 ...
- Unity 4.6 bate 20 or 4.5.5 +vuforia3.0.9 发布到真机错误 解决
错误图 +错误码 014-11-20 15:45:49.224 youzheng[6527:1035587] ################### enable 32014-11-20 15:45: ...
- .net core提示502.5错误
最近给WindowsServer2012服务器部署.Net Core项目,部署后一直显示502.5错误,具体如下: 网上找了一大堆解决办法都行不通,最后在stackoverflow中找到说是缺少一个补 ...
- 【Shell】函数
函数 1.语法 函数定义语法如下: [ function ] funname [()] { action; [return int;] } 说明 : 函数定义时,function 关键字可有可无. 函 ...
- (内附示例源码)如何通过electron构建桌面跨平台音视频应用
近年来,视频直播.直播带货.在线教育.在线医疗等音视频领域的相关行业都非常热门,成为大众瞩目的焦点. 在不久的将来,音视频技术渗透于各行各业,无处不在.从IoT网络到个人用户的移动设备,音视频技术以不 ...