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;
    }
  • 相关阅读:
    汇编之EBP的认识。
    【转】PE详解
    迟到的,2016年终总结
    Java 反射
    Java 集合与容器类
    Java 类加载与实例化
    Java 类与对象
    Java 值传递与对象拷贝
    Java 面向对象
    二叉树
  • 原文地址:https://www.cnblogs.com/codingmylife/p/2667735.html
Copyright © 2011-2022 走看看