赞
踩
题目链接:https://www.lintcode.com/problem/minimum-subtree/description
描述:给一棵二叉树, 找到和为最小的子树, 返回其根节点。输入输出数据范围都在int内。
代码实现使用了遍历的方法。也想过分治算法,但感觉这道题更适合遍历的方法,个人觉得因为要对每棵子树进行遍历且要找和最小的,这里需要一个全局的变量记住最小和,以便遍历找到的每个子树和它进行比较,以此求最小子树,所以我觉得重新定义一个辅助函数,且借助全局变量的遍历方式进行递归也许会好一些。
代码中需要注意的地方是:int findminSum(TreeNode * root, TreeNode*& minSubtree, int& minSum) { ... }
这个辅助递归函数中minSubtree变量,要是指向指针的指针,这里只是用了指针引用,道理是一样的。为什么需要这样?因为这个minSubtree指针在该函数中使用时,实际是为了存储root这个指针变量,而她本身又得是TreeNode指针,所以是为了记忆指针变量的指针,这里如果你只是使用TreeNode* minSubtree的话,最终返回的结果会是空。
代码实现如下:
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this->val = val; * this->left = this->right = NULL; * } * } */ class Solution { public: /** * @param root: the root of binary tree * @return: the root of the minimum subtree */ //递归的定义 int findminSum(TreeNode * root, TreeNode*& minSubtree, int& minSum) { //递归的出口 if (nullptr == root) { return 0; } //递归的拆解 int leftSum = findminSum(root->left, minSubtree, minSum); int rightSum = findminSum(root->right, minSubtree, minSum); int tmpminSum = root->val + leftSum + rightSum; if (tmpminSum < minSum) { minSum = tmpminSum; minSubtree = root; } return tmpminSum; } TreeNode * findSubtree(TreeNode * root) { int minSum = INT_MAX; TreeNode* minSubtree = nullptr; //递归的调用 findminSum(root, minSubtree, minSum); return minSubtree; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。