在一棵树T中两个结点u和v的最近公共祖先(LCA),是树中以u和v为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。
int find(Tree T, int x) { if T为空 then return 0 end if if x 等于 关键字 then return 1 else if x 大于 关键字 递归函数find(T->Right, x) else 递归函数find(T->Left, x) end if } int LCA(Tree T, int u, int v) { if T 为空 then 返回ERROR end if if find(T, u) 返回0或者find(T, v)返回0 then 返回ERROR end if if T->Key 大于等于u而且T->Key小于v或者 T->Key 小于等于 u而且T->Key 大于等于 v then 返回 T->Key if (u 大于 T->Key) then //使用递归找下一个结点 递归函数LCA(T->Right, u, v); else if u 小于 T->Key 递归函数LCA(T->Left, u, v) end if }
实现QQ新账户申请和老账户登录的简化版功能。最大挑战是:听说如今的QQ号码已经有10位数了。
头文件: #include <bits/stdc++.h> #include<iostream> #include<map> #include<string> int main() 定义整数n,m; 定义字符串 a,b,c; set<string> match; //初始化set容器match 存帐号 map<string,string> iter; //存帐号对应的密码 输入n; while n大于0且n自减 do 输入 a、b、c; if a等于L then if match.find(b)等于match.end() then ///调用find函数 已有帐号中没找到该帐号 输出ERROR: Not Exist else if iter[b]不等于c 输出ERROR: Wrong PW else 输出Login: OK end if else if a等于N if match.find(b)不等于match.end() then 输出ERROR: Exist else 输出New: OK iter[b]=c; match.insert(b); end if end if end while
本题要求实现给定二叉搜索树的5种经常使用操做。
Position FindMin(BinTree BST) if BST 不为空 then if BST的左孩子不空 then 递归调用函数 FindMin(BST->Left); else 返回BST; end if Position FindMax(BinTree BST) if BST 不为空 then if BST右孩子不为空 then while BST右孩子不为空 BST = BST->Right; end while end if end if 返回 BST; BinTree Insert(BinTree BST, ElementType X) if BST为空 then 定义BinTre类型结点p; 申请动态空间; X存入p的数据域; p的左右孩子初始化为空; BST = p; else if X < BST->Data then BST->Left = Insert(BST->Left, X); else if X < BST->Data then BST->Right = Insert(BST->Right, X); //利用递归来进行数据的插入 end if 返回 BST; BinTree Delete(BinTree BST, ElementType X) if BST 为空 then 输出Not Found else if X < BST->Data then BST->Left = Delete(BST->Left, X); else if X > BST->Data then BST->Right = Delete(BST->Right, X); else if X = BST->Data if BST的左右孩子都不为空 then 新建BinTree类型结点p; p = FindMin(BST->Right); BST->Data = p->Data; BST->Right = Delete(BST->Right, BST->Data); else if BST的左孩子为空 then BST = BST->Right; else if BST右孩子为空 then BST = BST->Left; end if end if end if 返回 BST Position Find(BinTree BST, ElementType X) if BST为空 then 返回空值; if BST->Data == X then 返回BST结点; else if X < BST->Data then 利用递归找下一个左孩子结点; else if (X > BST->Data) 利用递归找下一个左孩子结点; 返回BST
二叉搜索树或者是一棵空树,或者是具备下列性质的二叉树: 若它的左子树不空,则左子树上全部结点的值均小于它的根结点的值;若它的右子树不空,则右子树上全部结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。(摘自百度百科) 给定一系列互不相等的整数,将它们顺次插入一棵初始为空的二叉搜索树,而后对结果树的结构进行描述。你须要能判断给定的描述是否正确。例如将{ 2 4 1 3 0 }插入后,获得一棵二叉搜索树,则陈述句如“2是树的根”、“1和4是兄弟结点”、“3和0在同一层上”(指自顶向下的深度相同)、“2是4的双亲结点”、“3是4的左孩子”都是正确的;而“4是2的左孩子”、“1和3是兄弟结点”都是不正确的。
首先建树,读查询的字符串输入是个问题,如何去把每条查询的节点编号提取出来是解决的关键 不要每一条查询都去遍历树,能够先把节点之间的关系:是否在同一层、左孩子、右孩子、祖先节点等保存在map中后边直接根据map判断 还要就是可能查询的节点编号不在树上
本身来写确定写不出来,若是是我来写的话建树过程当中记录每一个点高度,以及每一个点指向的结点,这样子在后面查询的时候会方便点。对map函数的应用就没怎么太大的理解 ,这个做者对于map容器理解的很好,我不会像用数组同样利用下标来操做,不过这样也更体现map的快速查找功能。以前百度讲解map容器时候有说过可使用下标,可是若是map下标运算符[]运用不得当,也会形成意想不到的问题。