EOJ 1811 树的遍历
来源:互联网 发布:墙布 知乎 编辑:程序博客网 时间:2024/05/22 11:46
#include <iostream>#include <stdlib.h>#include <stdio.h>struct DNODE//构建层号标示法的节点{ int lev; char data;};struct Node//构建树的节点{ int lev; char data; Node* parent; Node* child[30]; Node(DNODE a)//树的节点的初始化,Node的data,lev与层号标示法的相同 { data=a.data; lev=a.lev; for(int i=0;i<30;i++)//顺便将Node的子节点,父节点设为空 child[i]=NULL; parent=NULL; }};DNODE a[30];Node* buildtree(DNODE *a,int n)//建树{ Node *root,*p,*q; if(n<1) return NULL; root=new Node(a[0]);//根节点先设置为a[0] p=root; for(int i=1;i<n;i++)//将剩余的n-1个节点放入到Node中 { q=new Node(a[i]);//生成新节点 while(p->lev>=q->lev)//如果p的层号大于等于q的层号,就寻找p的父节点 p=p->parent; q->parent=p;//q的父节点此时就为p int j=-1; while(p->child[++j]!=NULL);//寻找p的不为空的子节点 p->child[j]=q;//将q放入p的子节点 p=q; } return root;//返回根节点}void postorder(Node *root)//后序遍历打印树的节点{ if(root)//如果树非空 { for(int i=0;i<30;i++) { if(root->child[i])//如果子节点非空 postorder(root->child[i]);//递归调用postorder函数 else break; } printf("%c",root->data);//后序遍历,最后打印节点值 }}int main(){ int n; scanf("%d",&n);//输入节点的个数 getchar();//读入换行符 int i; for(i=0;i<n;i++) { scanf("(%d,%c)",&a[i].lev,&a[i].data);//注意输入的结构 getchar();//每次读入空格 } Node *root=buildtree(a,n);//建树 postorder(root);//后序遍历 printf("\n"); return 0;}
注意树的层号标示时需要建立两个struct,一个存储最后的树,一个用来存储层号标示的节点。使用层号标示的节点来初始化树的节点,然后每次寻找此节点的根节点,插入到根节点的子节点中。插入后,注意要将q赋值给p,即p现在是刚刚的p的子节点。再进行循环,另外注意后序遍历的递归方法,将后序遍历的输出写到每次调用递归的最后。
0 0
- EOJ 1811 树的遍历
- EOJ 1812 二叉树的深度
- EOJ 1813 树重建
- EOJ 1815 Huffman树
- EOJ
- EOJ
- EOJ
- EOJ 3179 简单的匹配
- EOJ------丽娃河的狼人传说
- EOJ 2067 最小生成树
- EOJ 1814 完全二叉树?
- EOJ-3261 字典树 + dp
- EOJ 1200 聪明的张小强 大数
- EOJ 1800 线性表的删除
- EOJ 3263 丽娃河的狼人传说 题解
- EOJ 3263 丽娃河的狼人传说(贪心)
- EOJ 3263:丽娃河的狼人传说
- eoj 3330 沉陷过往的幻灭
- 程序猿头发保护协会
- Apache2(httpd-2.4.23)虚拟主机的配置
- 多重继承
- Android Fragment 真正的完全解析(下)
- append标签
- EOJ 1811 树的遍历
- java-面向对象编程-简介
- Linux日志查询技巧
- Linux设备驱动一 (3)异步通知
- PHP debug 环境配置
- 正则表达式 贪婪匹配 转义
- 双向冒泡排序
- main.cpp
- Linux下非交互式sshpass登录