给出一个二叉搜索树的先序遍历,要求重新构造出这个二叉搜索树。一开始给出了一个递归的算法,指出复杂度有更优的解法。然后想出来一个O(n)的算法,就是使用一个栈,然后依次判断新的节点比原来的大还是小,然后放入左子树或右子树。

实现过程中,一开始用了class,被指出成员默认是private的,于是马上改用struct。接下来写得一开始还行,但后来发现有bug之后思路有点蒙。经过多次试验,才发现是大于和小于的两个判断调换了,但这时已经很靠后了。另外被指出,可以直接写,new TreeNode(val)这样的,不要先new出来再赋值,这样看起来垃圾代码很多,写起来看起来都不合算。

所以觉得接下来可能要二刷leetcode或着这些bug free的小code练习。

下面是完了之后又调了一下的代码。

#include <vector>
#include <stack>
#include <iostream>
using namespace std; struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int _val)
{
val = _val;
left = NULL;
right = NULL;
}
}; TreeNode* constructTree(vector<int> &preOrder)
{
stack<TreeNode*> st;
if (preOrder.size() == 0) return NULL;
TreeNode* root = new TreeNode(preOrder[0]);
st.push(root);
for (int i = 1; i < preOrder.size(); i++)
{
// peek stack
if (st.top()->val > preOrder[i])
{
TreeNode* tmp = new TreeNode(preOrder[i]);
st.top()->left = tmp;
st.push(tmp);
}
else if (st.top()->val <= preOrder[i])
{
TreeNode* last = st.top();
st.pop();
while (!st.empty() && st.top()->val <= preOrder[i])
{
last = st.top();
st.pop();
}
// stack.empty() || stack.top()->val > val
TreeNode* tmp = new TreeNode(preOrder[i]);
last->right = tmp;
st.push(tmp);
}
}
return root;
} void printTree(TreeNode* root)
{
if (root != NULL)
{
cout << root->val << endl;
printTree(root->left);
printTree(root->right);
}
} int main()
{
vector<int> vec;
vec.push_back(6);
vec.push_back(3);
vec.push_back(1);
vec.push_back(5);
vec.push_back(4);
vec.push_back(9);
vec.push_back(10);
TreeNode * root = constructTree(vec);
printTree(root);
system("pause");
}

  

[mock]12月11日的更多相关文章

  1. 2016年12月11日 星期日 --出埃及记 Exodus 21:6

    2016年12月11日 星期日 --出埃及记 Exodus 21:6 then his master must take him before the judges. He shall take hi ...

  2. 北京Uber优步司机奖励政策(12月11日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 日常Git使用——2019年12月11日16:19:03

    1.git介绍 1.1 什么是git? 什么是Git? 比如一个项目,两个人同时参与开发,那么就把这个项目放在一个公共的地方,需要的时候都可以去获取,有什么改动,都可以进行提交. 为了做到这一点,就需 ...

  4. [mock]10月11日

    第二次mock.出的题是,假设有一个地区不能使用7,都用之后的数字代替,比如8代表7,18代表16(中间有7和17).那么给出一个这个地区的数X,求普通地区的数Y.首先是找规律,发现其实就是找给出的数 ...

  5. 2016年12月11日 php面向对象

    面向对象 1.类(由众多对象中抽象出来的) 2.对象(一切皆对象,由类实例化出来的). 类: 求圆的面积 面向过程的方式 1.将圆抽象为一个类 2.实例化对象 class Qiu { var $ban ...

  6. [mock]12月27日

    一开始介绍项目,最后的反馈是,还是说得不清楚,需要再准备准备. 然后两道题,第一题是有个数组,有2*n个数字,从1~n.比如n=3的数组,{1,2,2,3,1,3}.然后两两相同的数字删除,每次删除得 ...

  7. [mock]12月28日

    假设我们有一个全局升序数组,这个数组长度unlimited现在我们有一个全局的指针和一个目标target值,target和指针你不可见.但是有以下几个操作bool istag();void gorig ...

  8. Week14(12月11日):路由

    Part I:提问 =========================== 1.Visual Studio 2013自带ASP.NET MVC最高版本为(). A.3  B.4  C.5  D.6 2 ...

  9. Week16(12月23日):复习

    Part I:提问 =========================== 1.声明强类型视图时,使用关键字(    ) A.ViewBag    B.model    C.Type    D.Tit ...

随机推荐

  1. C#核心语法

    目录 1. 特殊的数据成员........................................................................... 1 2. 数组(arr ...

  2. 【转】VS2012发布网站详细步骤

    1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布: 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 输入你自 ...

  3. artdialog 提示 确定或取消

    dialog({ title:'提示', content:"下载需扣除" + point + "个积分<br />重复下载不扣积分,需要继续吗?", ...

  4. Looper Handler 多线程

    Looper is created by default on main UI    Property:        // main ui thread, if Looper is initiali ...

  5. js给数字加三位一逗号间隔的两种方法(面试题)

    方法一:   <script type= "text/javascript"> //保留三位小数,toLocaleString() 方法可把一个 Number 对象转换 ...

  6. JavaScript的语法要点 4 - 面向对象的基础

    在传统的面向对象语言如C++.C#.Java中有类.对象.继承等概念.在JavaScript中又如何表示呢?JavaScript中没有class关键字,JavaScript中的类.对象.继承的概念是通 ...

  7. aix用命令查监听端口对应的进程

    --aix$netstat -an|grep LISTEN|grep 7867tcp4 0 0 *.7867 *.* LISTEN$netstat -Aan|grep 7867f1000e00029f ...

  8. centos6.5 最小化安装无法上网

    在VMware里装了个centos 6.5.  最小化安装后无法上网.在 google里找到答案 第一步:执行命令启动网卡 (最小化安装不是自动启动的) [root@localhost]# ifcon ...

  9. 快速搭建Web环境 Angularjs + Express3 + Bootstrap3

    快速搭建Web环境 Angularjs + Express3 + Bootstrap3 AngularJS体验式编程系列文章, 将介绍如何用angularjs构建一个强大的web前端系统.angula ...

  10. 使用bootstrap+asp.net mvc4+IBatis.Net实现的小程序

    这个项目用到了三个技术点 1.bootstap 3.0 2.asp.net mvc4 3.IBatis.Net 这个三个技术点分别解决前端界面展示.中间mvc路由控制.实体框架映射数据访问 重点分页问 ...