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