街区路灯问题【二叉树】

一个街区为了提高街区安全性,需要在街区的路灯上安装若干摄像头,用一个二叉树表示街区的路灯。 每个节点表示一个路灯,在路灯上安装摄像头。每个摄像头可以监控其自身、父对象和直接子对象。 为保证每个路灯都被监控,请计算所需的最小摄像头数。

输入描述:

输入一串字符,代表由前序排列的二叉树表示的路灯,字符由'0'和'#'组成,每个'0'表示一个要监控的路灯, '#'表示子节点为空

输出描述:

所需最小摄像头数。

思路

构建二叉树采用消融的方式:将'0##'变成一个‘#’放回字符串。重复这个方式直到 字符串只剩下一个‘#’,树就建成了。

建树的过程实际上是一个递归返回的过程,和我们递归遍历一棵树是等价的。 因此,可以把求解的过程和建树一同进行。每找到一棵树[既0##]:

1. 确定子树放的路灯数量;
2.确定子树需不需要父节点帮忙放路灯
3.确定子树的根有没有放路灯,从而决定自己需不需要放。
 struct TreeNode {
      char val;
      char tag;
      bool need;
      bool put;
      size_t count;
      TreeNode *left, *right;
      TreeNode(char x) : val(x), tag(x), 
                left(NULL), right(NULL),
                need(false), put(false), count(0){}
};

void delTree(TreeNode* root){
    queue<TreeNode*> fifo;
    fifo.push(root);
    while(!fifo.empty()){
        TreeNode* node = fifo.front();
        if(node){
            fifo.push(node->left);
            fifo.push(node->right);
            delete node;
        }
        fifo.pop();
    }
}

size_t makeTree(string s){
    stack<TreeNode*> st;
    for(int i = 0; i < s.size();++i){
        if(!st.empty() && (s[i] == '#' && st.top()->tag == '#')){
            TreeNode* r = new TreeNode('#');
            while(!st.empty() && st.top()->tag == '#'){
                TreeNode* l = st.top();
                st.pop();
                TreeNode* root = st.top();
                st.pop();
                root->left = l;
                root->right = r;
                root->tag = '#';

                root->count += l->count;
                root->count += r->count;

                if(l->need || r->need){
                    root->count += 1;
                    root->put = true;
                    root->need = false;
                }else if(l->put || r->put){
                    root->need = false;
                    root->put = false;
                }else{
                    root->put = false;
                    root->need = true;
                }
                r = root;
            }
            st.push(r);
        }else{
            st.push(new TreeNode(s[i]));
        }
    }
    auto root =  st.top();
    size_t result = root->need ? root->count + 1 : root->count;
    delTree(root);
    return result;
}
全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4295次浏览 75人参与
# AI面会问哪些问题? #
27838次浏览 553人参与
# 米连集团26产品管培生项目 #
13345次浏览 285人参与
# 你的实习产出是真实的还是包装的? #
20197次浏览 342人参与
# 找AI工作可以去哪些公司? #
9097次浏览 233人参与
# 春招至今,你的战绩如何? #
65150次浏览 582人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15218次浏览 221人参与
# 从事AI岗需要掌握哪些技术栈? #
8932次浏览 304人参与
# 中国电信笔试 #
32001次浏览 292人参与
# 你做过最难的笔试是哪家公司 #
33504次浏览 231人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340809次浏览 2174人参与
# 阿里笔试 #
178566次浏览 1316人参与
# 哪些公司真双非友好? #
69587次浏览 289人参与
# 机械人避雷的岗位/公司 #
62703次浏览 393人参与
# 第一份工作一定要去大厂吗 #
14611次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22077次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26250次浏览 310人参与
# 沪漂/北漂你觉得哪个更苦? #
9843次浏览 193人参与
# 应届生第一份工资要多少合适 #
20683次浏览 86人参与
# HR最不可信的一句话是__ #
6238次浏览 114人参与
# AI时代,哪个岗位还有“活路” #
11535次浏览 345人参与
# 春招你拿到offer了吗 #
831221次浏览 9987人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务