writer:pprp
date: 20171103

题目描述

给定一棵二叉树的中序和层序输出,判断是否为平衡二叉树的。如果是,输出YES如果不是输出NO。

输入

树结点个数

中序遍历序列

层序遍历序列

输出

是否是平衡二叉树的判断结论

样例输入

样例1:

3

1 2 3

2 1 3

样例2:

4

1 2 3 4

1 2 3 4

样例输出

样例1:

YES

样例2:

NO

代码如下:

//M: 判别平衡二叉树
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath> using namespace std;
const int maxn = 1000;
int n; struct tree
{
tree * lchild;
tree * rchild;
int val;
tree():lchild(NULL),rchild(NULL),val(0) {}
}; tree* createTree(int * layer, int * in,int n)
{
if(n == 0)
return NULL;
int rin[maxn],lin[maxn],rlayer[maxn],llayer[maxn];
memset(rin,0,sizeof(rin)),memset(lin,0,sizeof(lin));
memset(rlayer,0,sizeof(rlayer)),memset(llayer,0,sizeof(llayer));
tree * node = new tree;
node->val = layer[0];
int index = 0;
for(index = 0 ; index < n ; index++)
if(in[index] == layer[0])
break;
if(index == n)
{
cout << "Not found 404" << endl;
return NULL;
}
int cnt = 0;
for(int i = 0; i < index; i++)
lin[cnt++] = in[i];
cnt = 0;
for(int i = index+1 ; i < n; i++)
rin[cnt++] = in[i]; int llayercnt = 0, rlayercnt = 0;
for(int i = 1 ; i < n; i++)
{
for(int j = 0 ; j < index; j++)
{
if(lin[j] == layer[i])
llayer[llayercnt++] = layer[i];
}
}
for(int i = 1; i < n ; i++)
{
for(int j = 0 ; j < cnt; j++)
{
if(rin[j] == layer[i])
rlayer[rlayercnt++] = layer[i];
}
}
node->lchild = createTree(llayer,lin,llayercnt);
node->rchild = createTree(rlayer,rin,rlayercnt);
return node;
} bool solve(tree * root, int& depth)
{
if(root == NULL)
{
depth = 0;
return true;
}
int leftdepth, rightdepth;
bool bleft = solve(root->lchild,leftdepth);
bool bright = solve(root->rchild,rightdepth); if(bleft && bright)
{
if(abs(leftdepth-rightdepth)<=1)
{
depth = 1+(leftdepth>rightdepth?leftdepth:rightdepth);
return true;
}
}
return false;
} void post(tree * root)
{
if(root != NULL)
{
post(root->lchild);
post(root->rchild);
cout << root->val << " ";
}
} int main()
{
int n;
cin >> n;
int layer[maxn],in[maxn];
for(int i = 0 ; i < n; i++)
cin >> in[i];
for(int j = 0 ; j < n ; j++)
cin >> layer[j];
tree * root = createTree(layer,in,n);
int depth = 0;
// post(root);
// cout << endl; if(solve(root,depth))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}

最新文章

  1. 【JAVA并发编程实战】2、对象的组合
  2. svn代码版本管理总结
  3. FTP上传文件夹
  4. react-redux-react-router直通车
  5. Qt源码分析之信号和槽机制
  6. JAVA 从GC日志分析堆内存 第七节
  7. [cocos2dx注意事项014]一个用于cocos2dx对象智能指针模板
  8. 听翁恺老师mooc笔记(9)--枚举
  9. 1.3、Android Studio创建一个Android Library
  10. python 练习2
  11. 阿里云ECS安装的redis服务器,用java代码去连接报错。
  12. 吴裕雄 python 机器学习-NBYS(2)
  13. ASCII码表以及不同进制间的O(1)转换
  14. tensorflow笔记1:基础函数、embedding_lookup
  15. .NET基础 (20).NET中的数据库开发
  16. 【转载】TableLayout表格布局详解
  17. Apache2.4.34 + php 7.28 + MySQL8.0.12 安装及配置
  18. POJ3006-Dirichlet&#39;s Theorem on Arithmetic Progressions
  19. P3994 高速公路
  20. Remove Duplicates from Sorted List ,除去链表中相邻的重复元素

热门文章

  1. mysql导出成execl
  2. Python中的Numpy
  3. 剑指Offer——把二叉树打印成多行
  4. Linux命令:tac
  5. python web中的文件上传与下载
  6. Jmeter+jenkins如何快速搭建接口和性能测试持续集成解决方案-[基于windows篇]
  7. mysql忘记密码怎么办?(转)
  8. 获取Json字符串中某个key对应的value
  9. 通过Java编码获取String分行字符串的内容
  10. centos 升级nginx到1.10.2