zoukankan      html  css  js  c++  java
  • 二叉树移石头

        今天跟同学讨论面试题,又提到这个题了。之前在论坛里有人说是MSRA用过的面试题。题是这样的,假设有1棵二叉树,已知这棵树的节点上不均匀地分布了若干石头,石头数跟这棵二叉树的节点数相同。石头只能在子节点和父节点之间搬迁,每次只能搬运一块石头。请问如何以最少的步骤将石头搬运均匀,使得每个节点上的石头刚好为1。

        我想到的是用后根遍历解,除了递归不需要额外空间,时间复杂度O(n)。

    struct node
    {
        int id;
        int stone;
        node *left;
        node *right;
    };
     
    int move_stone(node *root, int &min_step)
    {
        if (root != NULL)
        {
            int left_needs = move_stone(root->left, min_step);
            int right_needs = move_stone(root->right, min_step);
     
            min_step += abs(left_needs);
            min_step += abs(right_needs);
     
            return -(root->stone - left_needs - right_needs - 1);
        }
     
        return 0;
    }
  • 相关阅读:
    任务框架--Quartz 配置文件
    地址和值
    线性基学习笔记
    S07
    如何在实际项目中使用PageHelper分页插件
    设计模式:原型模式
    常用JS代码片段
    Thomson Plaza里面的三家店以及水果大会
    13.搜索过滤
    07-多线程
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2667735.html
Copyright © 2011-2022 走看看