博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1020. Tree Traversals (25)
阅读量:4928 次
发布时间:2019-06-11

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

距离18号的PAT考试还有18天,最重要的是挖透做过的每一题

 

(1)基本思路:

1.建树用right数组和left保存各个节点的右左节点

2.层次遍历

 

#include 
#include
#include
using namespace std;#define M 32int post[M];int in[M];int n;int left[M];int right[M];queue
q;//建树int built_tree(int st1,int end1,int st2,int end2,int root){ if(st1 > end1 || st2 > end2) return 0; if(st1 == end1 || st2 == end2) return post[st1]; for(int i=st2;i<=end2;i++) { if(root == in[i]) { int ne1=st1+i-st2-1; left[root]=built_tree(st1,ne1,st2,i-1,post[ne1]); right[root]=built_tree(ne1+1,end1-1,i+1,end2,post[end1-1]); } } return root;}int main() { scanf("%d",&n); memset(post,0,sizeof(post)); memset(in,0,sizeof(in)); memset(left,0,sizeof(left)); memset(right,0,sizeof(right)); for(int i=0;i

 

(2)不建树直接用一个数组存储结果

 

不过在这之前先试一下更简单的---转换成先序(根左右)

#include 
#include
#include
using namespace std;#define M 32int post[M];int in[M];int n;//start 为in中的start end同,root为post中的rootvoid pre(int root,int start,int end,int cnt) { if(start > end) return; //find left subtree and right subtree //比如左子树不存在那么该算法会认为根为左子树的start而end则是通过根减一得到 //所以会产生start比end大的情况 //同理右子树不存在start为i+1而新的end为原来的end //如果是一个节点的树那么会有start=end //如果start end相等就是多个节点的树 int i; for(i=start;i<=end;i++) { if(in[i]==post[root]) break; } cnt == 0? printf("%d",post[root]):printf(" %d",post[root]); //left subtree pre(root-end+i-1,start,i-1,++cnt); //right subtree pre(root-1,i+1,end,++cnt);}int main() { scanf("%d",&n); memset(post,0,sizeof(post)); memset(in,0,sizeof(in)); for(int i=0;i

 

层次遍历

技巧就是虽然不是层次遍历但是可以用index来得到对应的层次中的节点

                           1

                   |                 |

                  2                  3

            |          |         |          |

         4            5        6         7

      访问顺序虽然是1 2 4  5  3 6 7 (先序)

  但是用index从零开始记录

  访问顺序虽然没有变但是存在数组的位置却是按照层次来的 比如0位置存1    2*0+1位置 存2  2*0+2存3以后同理

#include 
#include
using namespace std;#define M 32//数组开大一点不然最后一个过不去#define N 1000000int post[M];int in[M];//不能只开M的大小的数组因为空节点也会存在level中int level[N];int n;void pre(int root,int start,int end,int index) { if(start > end) return; int i; for(i=start;i<=end;i++) { if(in[i]==post[root]) break; } level[index]=post[root]; //left subtree pre(root-end+i-1,start,i-1,2*index+1); //right subtree pre(root-1,i+1,end,2*index+2);}int main() { scanf("%d",&n); memset(post,0,sizeof(post)); memset(in,0,sizeof(in)); memset(level,-1,sizeof(level)); for(int i=0;i

 

 

转载于:https://www.cnblogs.com/tclan126/p/8485649.html

你可能感兴趣的文章
2018沈阳J How Much Memory Your Code Is Using?
查看>>
PHP连接sql server
查看>>
闭包的好处罗列
查看>>
第十六章 模板和泛型编程
查看>>
android获取手机ip
查看>>
【2016.12.03】CSS笔记
查看>>
hihocoder1766 字符串问题
查看>>
接口测试总结
查看>>
jquery.validate.js常用扩展函数
查看>>
Python标准库03 路径与文件 (os.path包, glob包)
查看>>
深入了解 Flexbox 伸缩盒模型
查看>>
排序算法之插入排序
查看>>
选择排序
查看>>
【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD
查看>>
网页或微信小程序中使元素占满整个屏幕高度
查看>>
C#枚举数值与名称的转换实例分享
查看>>
C++ push方法与push_back方法
查看>>
Spring4笔记8--Spring与JDBC模板(IoC应用的例子)
查看>>
B. Batch Sort
查看>>
构建应用层服务
查看>>