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;
}

随机推荐

  1. [WPF系列]-ListBox

    引言 本文就WPF中的ListBox常用项给以实例代码演示,包括隐蔽属性的设置,Style设置,以及ControlTemplate的自定义.   Listbox平滑滚动 <ListBox Ite ...

  2. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

  3. Value must be an existing directory配置tomcat问题

    今天tomcat配置遇到了这么个问题,表示tomcat下少什么文件夹,一般是你的安装目录tomcat文件夹下面少了一个temp文件夹,在tomcat的安装文件夹下建一个temp文件夹再加一次tomca ...

  4. Winform开发中常见界面的DevExpress处理操作

    我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开 ...

  5. fir终端打包,亲测可用

    1.注册fir.拿到token 2.安装 fir-cli 使用 Ruby 构建, 无需编译, 只要安装相应 gem 即可. $ ruby -v # > 1.9.3 $ gem install f ...

  6. HTML5游戏设计与开发 小白7-9月的动态

    好久没有更新博客了,最近在努力修炼提升逼格,当然了还有个恶心的毕业论文... 当然啦...在写这个论文的时候也就是为了提升下自身的技术,毕竟我的公司也不是游戏公司,SO 我决定开发个手机游戏.然后考虑 ...

  7. java定时器的几种用法[转]

                                  Timer timer =          timer.schedule(                              Sy ...

  8. SQL语句技巧之去除重复行

    去除表中重复行数据,可能大家立马就想到的是用DISINTCT关键字,但DISINTCT只能是去除表中所有列都相同的行,若碰到需要去除表中多个字段重复的行(即:部份相同,部份不相同),那么该如何做呢?我 ...

  9. SharePoint Server 2010 &amp; WorkFlow related Limits

    Today, I have come across different workflow related limits for SharePoint Server 2010. Limit Maximu ...

  10. 两款CSS3样式可视化在线生成工具

    CSS3随着浏览器的升级已经被越来越广泛的运用,合理的运用CSS3可以使你的网站更加美观,并且之前只能用js才能实现的效果也已经可以直接用 CSS3来实现.但是虽然如此,很多浏览器对CSS3的支持还都 ...