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. ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []

    [1]问题背景:Oracle数据库版本为11.2.0.1,操作系统CentOS release 5.9,详细的报错信息如下: Dump file /data/oracle/diag/rdbms/db0 ...

  5. 最有价值的50道java面试题 适用于准入职Java程序员

    下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最 ...

  6. 50道基础的java面试题

    Java程序员面试题集(1-50) 一.Java基础部分 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象 ...

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

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

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

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

  9. 1Z0-050

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

随机推荐

  1. TCP四种计时器

    TCP共使用以下四种计时器,即重传计时器.坚持计时器.保活计时器和时间等待计时器 .这几个计时器的主要特点如下:      1.重传计时器      当TCP发送报文段时,就创建该特定报文段的重传计时 ...

  2. 在终端terminal运行ReactNative程序经常出现的问题

    各种问题汇总: 1.Unable to resolve modules lodash  (这里举例lodash,这个lodash也可以是别的.意思就是缺少当前模块,所以需要安装) npm instal ...

  3. JS+HTML5的Canvas画图模拟太阳系运转

    查看效果:http://hovertree.com/texiao/html5/9.htm 地球自传 http://hovertree.com/texiao/html5/8.htm 代码如下: < ...

  4. 【mysql】数据库使用的一些规范

    一.MySQL存在的问题 优化器对复杂SQL支持不好 对SQL标准支持不好 大规模集群方案不成熟,主要指中间件 ID生成器,全局自增ID 异步逻辑复制,数据安全性问题 Online DDL HA方案不 ...

  5. git checkout -b 的详细讲解

    创建分支: $ git branch mybranch 切换分支: $ git checkout mybranch 创建并切换分支: $ git checkout -b mybranch 更新mast ...

  6. [solr] - 数据库导入

    这里使用的是mysql测试. 1.先在mysql中建一个表:solr_test 2.插入几条测试数据: 3.用记事本打solrconfig.xml文件,在solrhome文件夹中.E:\solrhom ...

  7. COGS 渡轮问题 (LIS规定字典序输出方案数)

    /* 下标字典序最小 */ #include<iostream> #include<cstdio> #include<cstring> #define maxn 1 ...

  8. 浙江工商大学15年校赛E题 无邪的飞行棋 【经典背包】

    无邪的飞行棋 Time Limit 1s Memory Limit 64KB Judge Program Standard Ratio(Solve/Submit) 15.38%(4/26) Descr ...

  9. vue内置指令详解——小白速会

    指令 (Directives) 是带有 v- 前缀的特殊属性,职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM. 内置指令 1.v-bind:响应并更新DOM特性:例如:v-bi ...

  10. mysql驱动问题

    Unknown initial character set index '255' received from server. Initial client character 解决方法 驱动版本不对 ...