title: 构造二叉树 , 看这一篇就足够!
思想:构造整棵树 = 根节点 + 构造左子树 + 构造右子树
题目链接:从中序与后序遍历构造二叉树

必须明确条件:给出一个数组的值中,是没有重复的数字的,即没用节点的数值是相同的!
画图分析:(图来自dong哥)

可以很明确得知:后续遍历数组中postEnd就是中点的值,通过中点的值我们就可以在中序遍历数组中找到中点的位置,从而分割出左子树,右子树,递归就可以完成构建;
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return build(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
//都是不同的值组成,不存在“中”在左子树中出现的情况;
TreeNode* build(vector<int>& inorder, int inStart, int inEnd, vector<int>& postorder, int postStart, int postEnd) {
if (inStart > inEnd) return nullptr;
int rootVal = postorder[postEnd];
int size = 0;
for (int i = inStart; i <= inEnd; i++) {
if (rootVal == inorder[i]) { // 找到中序遍历“左 中 右” 的 “中”;
size = i - inStart; // 记录左的长度,需要使用其长度求其他下标 =》 因为起点不一定是从0开始,要用相对值
break;
}
}
//构建中节点,左右子树
TreeNode *root = new TreeNode(rootVal);
root->left = build(inorder, inStart, inStart + size - 1, postorder, postStart, postStart + size - 1);
root->right = build(inorder, inStart + size + 1, inEnd, postorder, postStart + size, postEnd - 1);
return root;
}
};
题目链接:从前序与中序遍历构造二叉树

同上,依据图来写代码即可:

class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd) {
if (preStart > preEnd) return nullptr;
int rootVal = preorder[preStart];
int size = 0;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == rootVal) {
size = i -inStart;
break;
}
}
// 开始构建树
TreeNode* root = new TreeNode(rootVal);
root->left = build(preorder, preStart + 1, preStart + size, inorder, inStart, inStart + size - 1);
root->right = build(preorder, preStart + size + 1, preEnd, inorder, inStart + size + 1, inEnd);
return root;
}
};
题目链接:根据前序和后序遍历构造二叉树

这道题与前两道题的不同之处:通过前序和后序是无法确定唯一一颗二叉树的!
原因:看图

前序和后序只能确定中,无法确定左右的边界!可能压根就没有左指针或者右指针 例如:preorder = [1,2,3], postorder = [3,2,1],而下图两种树结构都满足;

理解:我们假设前序遍历的第二个元素是左子树的根节点(左图),但实际上左子树有可能是空指针(右图),那么这个元素就应该是右子树的根节点。由于这里无法确切进行判断,所以导致了最终答案的不唯一。
这道题如何做:①确定根节点,②将前序遍历数组中根节点后的下一位为左根节点(preStart + 1, 自己也快选定其他), ③在后序遍历数组中找到该左根节点的位置,从而分割左右子树;如图:

代码:
class Solution {
public:
TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {
return build(preorder, 0, preorder.size() - 1, postorder, 0, postorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, int preStart, int preEnd, vector<int>& postorder, int postStart, int postEnd) {
if (preStart > preEnd) return nullptr;
int rootVal = preorder[preStart];
if (preStart == preEnd) return new TreeNode(rootVal);
int leftRootVal = preorder[preStart + 1];
int size = 0;
for (int i = postStart; i <= postEnd; i++) {
if (postorder[i] == leftRootVal) {
size = i - postStart;
break;
}
}
//构建二叉树
TreeNode* root = new TreeNode(rootVal);
root->left = build(preorder, preStart + 1, preStart + size + 1, postorder, postStart, postStart + size);
root->right = build(preorder, preStart + size + 2, preEnd, postorder, postStart + size + 1, postEnd);
return root;
}
};
优化建议:以上三题,均是不重复数组,可以用空间换时间的想法:可以采用哈希表记录 需要遍历的数组 对应的index, 这样在每次遍历的时候可以直接得到想要查询数的下标;
题目链接:最大二叉树


根据构造树的思想,依题目构造即可
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return build(nums, 0, nums.size() - 1);
}
TreeNode* build(vector<int>& nums, int start, int end) {
if (start > end) return nullptr;
int rootVal = INT_MIN;
int index = 0;
for (int i = start; i <= end; i++) {
if (rootVal < nums[i]) {
index = i;
rootVal = nums[i];
}
}
//构建树
TreeNode* root = new TreeNode(rootVal);
root->left = build(nums, start, index - 1);
root->right = build(nums, index + 1, end);
return root;
}
};
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack
我一直在尝试在Ruby中实现BinaryTree类,但我得到了stackleveltoodeep错误,尽管我似乎没有在该特定代码段中使用任何递归:1.classBinaryTree2.includeEnumerable3.4.attr_accessor:value5.6.definitialize(value=nil)7.@value=value8.@left=BinaryTree.new#stackleveltoodeephere9.@right=BinaryTree.new#andhere10.end11.12.defempty?13.(self.value==nil)?true:
我使用RVM安装Ruby-2.1.5并再次运行bundle。现在pggem不会安装,我得到这个错误:geminstallpg-v'0.17.1'----with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_configBuildingnativeextensionswith:'--with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config'Thiscouldtakeawhile...ERROR:Error
安装Rails时,一切都很好,但后来,我写道:rails-v和输出:/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--rails/cli(LoadError)from/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`r
运行bundle安装时,我收到以下消息:Rubygems2.0.14isnotthreadsafe,soyourgemswillbeinstalledoneatatime.UpgradetoRubygems2.1.0orhighertoenableparallelgeminstallation.这很奇怪,因为在我的RubyGems环境中它说我的RubyGems版本是:2.4.5.1(见下文)~/w/Rafftopia❯❯❯gemenvRubyGemsEnvironment:-RUBYGEMSVERSION:2.4.5.1-RUBYVERSION:2.2.5(2016-04-26patc
这是什么。我首先做了:rvmgetstablervminstallruby-2.2.2没有交易。它向我展示了以下内容:$rvminstallruby-2.2.2Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:ubuntu/14.04/i386/ruby-2.2.2.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Checkingrequirementsforubunt
例如,我可以很容易地继承自String,如下所示:classMyString'thingsandstuff'但是我如何继承没有构造函数的Rational呢?例如:defMyRatNoMethodError:undefinedmethod`new'forMyRat:ClassMyRat(10).inc#=>NoMethodError:undefinedmethod`MyRat'formain:ObjectMyRat.send(:initialize,10).inc#=>TypeError:alreadyinitializedclass#???#Noneofitworks!我找不到初始化新
将MacOS升级到10.14.2Mojave后,我无法再使用RVM安装任何Ruby版本。它总是给出这样的错误:$rvminstall2.5.3ruby-2.5.3-#removingsrc/ruby-2.5.3..Searchingforbinaryrubies,thismighttakesometime.Nobinaryrubiesavailablefor:osx/10.14/x86_64/ruby-2.5.3.Continuingwithcompilation.Pleaseread'rvmhelpmount'togetmoreinformationonbinaryrubies.Ch
我想创建一个介于散列和树之间的“Config”类。它只是用于存储全局值,可以有一个上下文。下面是我的使用方法:Config.get("root.parent.child_b")#=>"value"类可能如下所示:classConstructdefget(path)#splitpathby"."#searchtreefornodesenddefset(key,value)#splitpathby"."#createtreenodeifnecessary#settreevalueenddeftree{:root=>{:parent=>{:child_a=>"value",:child_b=