Chapter7: question 49 - 50

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
{
int v; // In this code, default positive Integer.
Node *child[3];
Node(int 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;
int r;
cin >> r;
if(r != 0) // equal to if(!r) return;
{
pRoot = new Node(r);
pRoot->child[0] = createTree();
pRoot->child[1] = createTree();
pRoot->child[2] = 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";
cout << root->v << endl << s;
printTree(root->child[0], level+1);
cout << endl << s;
printTree(root->child[1], level+1);
cout << endl << s;
printTree(root->child[2], level+1);
}

void releaseTree(Tree *root){
if(root == NULL) return;
releaseTree(root->child[0]);
releaseTree(root->child[1]);
releaseTree(root->child[2]);
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)
{
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[1]->child[1]->child[2];
Node *node2 = pRoot->child[1]->child[3]->child[1];
Node *father;
father = getFirstCommonFather(pRoot, node1, node2);
cout << father->v << endl;
releaseTree(pRoot);
}
return 0;
}

Chapter7: question 49 - 50,布布扣,bubuko.com

时间: 2024-11-12 14:14:57

Chapter7: question 49 - 50的相关文章

Chap3: question: 11 - 18

11. double 数值的整数次方 note: 浮点数表示时有误差,判等时必须自己根据精度要求实现. + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include <iostream> #incl

Chap4: question: 19 - 28

19. 二叉树的镜像(递归) 即:交换所有节点的左右子树.从下往上 或 从上往下 都可以. + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

子线程循环 10 次,接着主线程循环 100,接着又回到子线程循环 10 次, 接着再回到主线程又循环 100,如此循环 50 次

子线程循环 10 次,接着主线程循环 100,接着又回到子线程循环 10 次, 接着再回到主线程又循环 100,如此循环 50 次 1 package TestThread; 2 3 /** 4 * 子线程循环 10 次, 接着主线程循环 100, 接着又回到子线程循环 10 次, 接着再回到主线程又循环 100, 如此循环 50 次 5 * 6 * @author trfizeng 7 * 8 */ 9 public class ThreadTest { 10 static int round

UOJ#49. 【UR #3】铀仓库

数轴上n<=500000个点,点i在Xi处有Ai个东西,Xi递增,每秒钟可移动一单位并瞬间拿或放一个东西,最多能同时拿一个东西,任选择一个点在T<=1e18秒内把尽可能多的东西拿到该点. 感谢KPM大佬提供的解法!方便快捷! 最优方案一定是在这n个点上,因此枚举点看如何计算最优答案. 越往右边的点取到的最多点数的区间不一定越往右,如图: 上图中,选择的点向右移动后,拿到右边一堆点的代价变小,从而可以拿到左边更远的点,因此排除单调性,考虑二分. 可以发现到最优情况下到左右走的最远长度是一样的,但

SICP_2.48-2.49

1 #lang sicp 2 3 (#%require sicp-pict) 4 5 (define (make-vect a b) 6 (cons a b)) 7 8 (define (xcor-vect v) 9 (car v)) 10 11 (define (ycor-vect v) 12 (cdr v)) 13 14 (define (add-vect v1 v2) 15 (make-vect (+ (xcor-vect v1) 16 (xcor-vect v2)) 17 (+ (yco

49、剑指offer--把字符串转换成整数

题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 输入例子: +2147483647     1a33 输出例子: 2147483647     0 解题思路:本题需要考虑几个方面 1.如果非法输入,除了结果输出0,使用全局g_nStatus来标识(进入函数初始化为不合法,最后合法再置为合法) 2.正负号处理 3

TOJ刷题记录(2/50)

P1172:二分,最大化最小值 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <map> 9 #include <queue> 10

收集了50道基础的java面试题

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果