华为机考题-求二叉树的深度
来源:互联网 发布:逗游游戏盒mac版 编辑:程序博客网 时间:2024/04/29 21:35
求二叉树的深度描述:
给出一个字符串形式表达的二叉树,求出指定节点深度。
输入的树形结构字符串格式为:
1、以父节点、左子树、右子树表示的二叉树;每个父节点不会超过两个子节点;
2、树的每一个节点采用单个字母表示;树的层次采用数字表示,树根的层次为1,
下一层为2,不会超过9层;
3、字符串以“节点名称 层次数 节点名称 层次数…”的形式出现,同一个
父节点下,先出现的为左子树。
例如字符串“a1b2c2d3e3f3”生成一棵如下的树:
a
/ \
b c
/ \ /
d e f
节点a的深度为3,节点b的深度是2,节点f的深度是1
运行时间限制:无限制内存限制:无限制输入:一行字符串,表示一个二叉树
一行字符串,一个字符一个节点,输入确保字符不会存在重复节点
输出:指定节点的深度,如果节点不存在,返回0;整数之间用空格隔开
样例输入:a1b2c2d3e3f3ab样例输出:
3 2
#include <iostream>#include <map>#include <string>#include <vector>#include <queue>using namespace std;struct Node{char data;int level;int l, r;Node(char data, int level){this->data = data;this->level = level;l = -1; // NULLr = -1;}};// static listvector<Node> v; // maxsize is 1024queue<int> q[10]; // 1~9 level, store the index of the vmap<char, int> m; // char2indexint findDeep(int ind, int deep){ // index, current deepNode node = v[ind];int lDeep = deep, rDeep = deep;if(node.l != -1){lDeep = findDeep(node.l, 1+deep);} if(node.r != -1){rDeep = findDeep(node.r, 1+deep);}if(lDeep > rDeep){return lDeep;} else{return rDeep;}}int main(){string str;cin >> str;for(int i = 0; i < str.length(); i += 2){int level = str[i+1]-'0';Node newNode = Node(str[i], level);v.push_back(newNode);int curIndex = v.size()-1;m[str[i]] = curIndex;q[level].push(curIndex);// start to insert if(!q[level-1].empty()){int fatherIndex = q[level-1].front();if( v[fatherIndex].l == -1){ // the father node is emptyv[fatherIndex].l = curIndex;} else{v[fatherIndex].r = curIndex;q[level-1].pop(); // the father node is full}}}// start to querystring query;cin >> query;for(int i = 0; i < query.length(); i++){if(m.find(query[i]) != m.end()){int ind = m[query[i]];//cout << "index is " << ind << endl;//if(v[ind].l != -1){//cout << v[v[ind].l].data << endl;//}if(v[ind].r != -1){//cout << v[v[ind].r].data << endl;//} cout << endl;cout << findDeep(ind, 1); // current deep is 1} else {cout << 0;}if(i != query.length()-1){cout << ' ';} else{cout << endl;}}return 0;}
静态链表v
q用来存每一层的节点下标,对应1~9(0层不使用)。这样可以用来方便插入左、右子节点
m用来快速找到查询时输入的节点的下标(因为题目中提到,“输入的字符不存在重复节点”)
1 0
- 华为机考题-求二叉树的深度
- 华为练习 求二叉树的宽度和深度
- 华为oj 求二叉树的深度和宽度
- [华为机试练习题]42.求二叉树的深度和宽度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- 求二叉树的深度
- android提供的json解析类
- ios学习--UIFont的你想知道的所有
- 基于ZooKeeper的分布式Session实现
- SQL实现查看表结构以及表注释(comments)
- 多线程 等待/通知机制
- 华为机考题-求二叉树的深度
- Moore-Penrose广义逆矩阵
- string.format
- Java Executors(线程池)
- Android View Touch的事件分发机制
- P2P之UDP穿透NAT的原理与实现 - 增强篇(附修改过的源代码)
- radio接收并显示后台传值
- 关于java Socket Connection timed out: connect
- 与WebGL有关的教程与实例