华为机考题-求二叉树的深度

来源:互联网 发布:逗游游戏盒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
原创粉丝点击