二叉树俩个子节点的公共父节点
2015-08-15 19:13
344 查看
二叉树俩个子节点的公共父节点
(1)节点只有left right 无 father 有root
1 找各自路径 vector
2 找到之后 计算稍长的那个路径 长多少 下标访问 查找
3 找到 返回 path[i]
(2)节点有父节点 root 未知
1 计算各自路径长度
2 路经长的 向上走 走到 俩者路径相同处
3 节点形同即为值
(3)二叉排序树
1 从跟开始while遍历 temp=root
2 俩节点都比 temp 大 temp=temp->Right
都 小 temp=temp->pLeft;
否则 返回temp
(1)节点只有left right 无 father 有root
1 找各自路径 vector
2 找到之后 计算稍长的那个路径 长多少 下标访问 查找
3 找到 返回 path[i]
(2)节点有父节点 root 未知
1 计算各自路径长度
2 路经长的 向上走 走到 俩者路径相同处
3 节点形同即为值
(3)二叉排序树
1 从跟开始while遍历 temp=root
2 俩节点都比 temp 大 temp=temp->Right
都 小 temp=temp->pLeft;
否则 返回temp
----------------树的俩节点的最低公共祖先------------------- (1) 不知父亲 不是二叉排序树 只知道节点值 BianryTreeNode* Find(int node1,int node2,BianryTreeNode* pRoot) { std::vector path1; std::vector path2; bool find=false; //先找到各自路径 find|=getpath(pRoot,node1,path1); find&=getpath(pRoot,node2,path2); BianryTreeNode* preturn =NULL; if(find) { //长的先走几步,和短的相同起点 int min=path1>path2?path2:path1; int it1=path1.size()-min; int it2=path2.size()-min; for(;it1 &path) { if(pRoot==NULL) return ; if(pRoot->n!=n) { if(find(pRoot->pLeft,n,path)) { path.push_back(pRoot->n); return true; } else if(find(pRoot->pRight,n,path)) { path.push_back(pRoot->n); return true; } else { return false; } } else { path.push_back(pRoot->n); return true; } } (2)有父节点 BianryTreeNode* find(BianryTreeNode* node1,BianryTreeNode* node2) { if(node1==NULL||node2==NULL) { return NULL; } int len1=getlen(node1); int len2=getlen(node2); int n=0; BianryTreeNode* A=NULL,*B=NULL; if(len1>=len2) { BianryTreeNode* temp=node1; while(n++pfather; } A=temp; B=node2; } else { BianryTreeNode* temp=node2; while(h++pfather; } A=node1; B=temp; } while(A!=B) { A=A->pfather; B=B->pfather; } return A; } int getlen(BianryTreeNode* node1) { int n=0; BianryTreeNode* temp=node1; if(temp->pfather) { temp=temp->father; n++; } return n; } (3)二叉排序树 有root void find(BianryTreeNode* node1,BianryTreeNode* node2) { if(node1==NULL||node2==NULL) { return NULL; } BianryTreeNode* temp=root; while(temp) { if(node1->n>temp->n&&node2->n>temp->n) { temp=temp->pRight; } else if(node1->nn&&node2->nn) { temp=temp->pLeft; } else return temp; } return NULL; }
相关文章推荐
- OC 内存管理的黄金法则
- datetimebox设置默认时分秒
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- 程序员如何快速准备面试中的算法
- struts.xml在Action配置具体解释
- 利用rsync+inotify搭建实时同步系统