49. 把字符串转换为整数

很多细节需要注意。(空格,符号,溢出等)

Go: 8. String to Integer (atoi)

50. 树种两个结点的最低公共祖先

A. 若是二叉搜索树,直接与根结点对比。 若都大于根节点,则在友子树;若都小于根节点,则在左子树;若根节点介于两数之间,则根节点即为答案。

B. 普通树,若是孩子节点有指向父节点的指针,则问题变为求两个链表的第一个公共结点。 如:37题。

C. 普通树:思路1,若一个结点的子树同时包含两个结点,而它的任一孩子结点的子树却不能同时包含,则该节点即为答案。需要重复遍历,时间复杂度较高。

思路2:先序优先遍历,分别记录从根节点到两个结点的路径。然后转换为求第一个公共结点问题。

#include <iostream>
#include <string>
#include <list>
using namespace std; 

typedef struct Node
{
    char v;     // In this code, default positive Integer.
    Node *child[3];
    Node(char x) : v(x){ child[0] = NULL; child[1] = NULL;child[2] = NULL; }
} Tree;
typedef list<Node*> PATH;
/********************************************************/
/*****        Basic functions  for tree     ***********/
Tree* createTree() // input a preOrder sequence, 0 denote empty node.
{
    Node *pRoot = NULL;
    char r;
    cin >> r;
    if(r != '0')         // equal to if(!r) return;
    {
        pRoot = new Node(r);
        for(int i = 0; i < 3; ++i)
            pRoot->child[i] = createTree();
    }
    return pRoot;
}
void printTree(Tree *root, int level = 1){
    if(root == NULL) { cout << "NULL"; return; };
    string s;
    for(int i = 0; i < level; ++i) s += "\t";
    printf("%c", root->v);
    for(int i = 0; i < 3; ++i)
    {
        cout << endl << s;
        printTree(root->child[i], level+1);
    }
}
void releaseTree(Tree *root){
    if(root == NULL) return;
    for(int i = 0; i < 3; ++i)
        releaseTree(root->child[i]);
    delete[] root;
    root = NULL;
}
/******************************************************************/
/****              获取第一个公共父节点              ******/
bool getPath(Tree *root, Node *node, PATH& path)
{
    if(root == NULL) return false;
    path.push_back(root);
    if(root == node)
        return true;
    bool found = false;
    for(int i = 0; i < 3; ++i)
    {
        found = getPath(root->child[i], node, path);
        if(found) break;
    }
    if(!found) path.pop_back();
    return found;
}

Node* getLastCommonNode(const PATH &path1, const PATH &path2) //  get the last common node of two lists
{
    Node *father = NULL;
    for(auto it1 = path1.begin(), it2 = path2.begin(); it1 != path1.end() && it2 != path2.end(); ++it1, ++it2)
    {
        if(*it1 == *it2) father = *it1;
        else break;
    }
    return father;
}

Node* getFirstCommonFather(Tree *root, Node *node1, Node *node2)
{
    if(root == NULL || node1 == NULL || node2 == NULL) return NULL;
    PATH path1, path2;
    if(getPath(root, node1, path1) && getPath(root, node2, path2))
        return getLastCommonNode(path1, path2);
    return NULL;
}
/************************************************************************/
int main(){
    int TestTime = 3, k = 1;
    while(k <= TestTime)
    {
        cout << "Test " << k++ << ":" << endl; 

        cout << "Create a tree: " << endl;
        Node *pRoot = createTree();
        printTree(pRoot);
        cout << endl; 

        Node *node1 = pRoot->child[0]->child[0]->child[1];
        Node *node2 = pRoot->child[0]->child[2]->child[0];
        Node *father;

        father = getFirstCommonFather(pRoot, node1, node2);
        cout << "the first common father node: " << father->v << endl;
        releaseTree(pRoot);
    }
    return 0;
}

Chapter7: question 49 - 50的更多相关文章

  1. 49. 3种方法实现复杂链表的复制[clone of complex linked list]

    [本文链接] http://www.cnblogs.com/hellogiser/p/clone-of-complex-linked-list.html [题目] 有一个复杂链表,其结点除了有一个ne ...

  2. ZOJ 刷题记录 (。・ω・)ノ゙(Progress:31/50)

    [热烈庆祝ZOJ回归] P1002:简单的DFS #include <cstdio> #include <cstring> #include <algorithm> ...

  3. 高质量PHP代码的50个实用技巧必备(下)

    26. 避免直接写SQL, 抽象之 不厌其烦的写了太多如下的语句: ? 1 2 <span style="color:#333333;font-family:''Helvetica, ...

  4. Redis集群(八):Redis Sharding集群

    一.Redis目前的集群方案主要有两种:Redis Sharding和Redis Cluster 1.Redis Sharding:3.0以前基本上使用分片实现集群,目前主流方案,客户端实现 2.Re ...

  5. Python之路,Day7 - Python基础7 面向对象

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  6. 1Z0-050

    QUESTION 13 View the Exhibit.Examine the following command that is executed for the TRANSPORT table ...

  7. S1的小成果:MyKTV系统

    转眼之间,已经到了2016年,即新的一年了!S1也结束了,收获的也不多 ,想想最后留给大家的就一个KTV项目了. 希望大家看时有所收获           现在我们一起来看KTV前台管理 主界面的运行 ...

  8. PAT自测-5 Shuffling Machine

    原题连接https://pta.patest.cn/pta/test/17/exam/4/question/264 Shuffling is a procedure used to randomize ...

  9. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q49-Q51)

    Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...

随机推荐

  1. VS2010安装帮助文档出现错误

    安装VS2010后的帮助文档安装出现错误:未能在指定文件夹中创建本地存储区 安装完VS2010后,出现错误,取消后 再安装MSDN 打开“Help Library 管理器 - Microsoft He ...

  2. openoffice

    cmdcd/cd C:\Program Files (x86)\OpenOffice 4\program soffice -headless -accept="socket,host=127 ...

  3. 小技巧找出一个php的cron脚本出问题的代码行

    这个小技巧虽然很小,但是很有用. 我写了一个cron脚本,但是隔一天发现,这个昨天的cron脚本还一直在跑着,没有停下来,一定是里面有个程序堵住了. 但是如果我重新跑又需要很多时间.这个怎么办? 现在 ...

  4. studio 快捷键

    一,基础快捷键 1.1 Ctrl+N,Navigate | Class,快速打开某个类 1.2 Ctrl+Shift+N,  Navigate | File,  快速打开某个文件 1.3 Ctrl+S ...

  5. sencha touch之store

    store相当于数据库的表,是模型实例的集合.(是不是可以看成结构体数组) 可以对模型实例进行新建.更新.读取.删除.排序和过滤等操作. 创建store 由于store是表,必须要有模型或者定义字段, ...

  6. 黄聪:Xmind修改默认字体风格设置

    Xmind是一款非常好用的思维导图软件,但默认字体使用宋体不够好看,软件本身不支持设置默认字体,但通过修改配置文件达到配置默认字体的目的 默认控制风格的配置文件位置 XMind\plugins\org ...

  7. 常见的 HTTP错误代码大全

    一些常见的状态码为: - 服务器成功返回网页 - 请求的网页不存在 - 服务不可用 详细分解: 1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 代码 说明 (继续) 请求者应当继 ...

  8. install Nagios on Unbuntu Unix

    Ubuntu Quickstart Up To: ContentsSee Also: Quickstart Installation Guides, Security Considerations I ...

  9. 2014年到期的myeclipse5.5.1注冊码

    假设点击Myeclipse的载入项目到server的图标没有反应,这就是MyEclipse过期了,下面是还能用一年的注冊码: subscriber: axin  Serial:nLR8ZC-85557 ...

  10. ubuntu 12.04 编译安装 nginx

    下载源码包 nginx 地址:http://nginx.org/en/download.html 编译前先安装两个包: 直接编译安装会碰到缺少pcre等问题,这时候只要到再安装两个包就ok sudo ...