最后一题:树中两个节点的最低公共祖先
来源:互联网 发布:0809赛季的韦德数据 编辑:程序博客网 时间:2024/06/05 15:37
/*************************************************************************题目:树中两个节点的最低公共祖先*************************************************************************/#include<stdio.h>#include <list>#include<vector>using namespace std;struct TreeNode { int m_nValue; std::vector<TreeNode*> m_vChildren; };TreeNode* CreateTreeNode(int value){ TreeNode* pNode = new TreeNode(); pNode->m_nValue = value; return pNode;}void ConnectTreeNodes(TreeNode* pParent, TreeNode* pChild){ if(pParent != NULL) { pParent->m_vChildren.push_back(pChild); }}bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list<TreeNode*>& path){ if(pRoot == pNode) return true; path.push_back(pRoot); bool found = false; vector<TreeNode*>::iterator i = pRoot->m_vChildren.begin(); while(!found && i < pRoot->m_vChildren.end()) { found = GetNodePath(*i, pNode, path); ++i; } if(!found) path.pop_back(); return found;}TreeNode* GetLastCommonNode( const list<TreeNode*>& path1, const list<TreeNode*>& path2){ list<TreeNode*>::const_iterator iterator1 = path1.begin(); list<TreeNode*>::const_iterator iterator2 = path2.begin(); TreeNode* pLast = NULL; while(iterator1 != path1.end() && iterator2 != path2.end()) { if(*iterator1 == *iterator2) pLast = *iterator1; iterator1++; iterator2++; } return pLast;}TreeNode* GetLastCommonParent(TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2){ if(pRoot == NULL || pNode1 == NULL || pNode2 == NULL) return NULL; list<TreeNode*> path1; GetNodePath(pRoot, pNode1, path1); list<TreeNode*> path2; GetNodePath(pRoot, pNode2, path2); return GetLastCommonNode(path1, path2);}// ====================测试代码====================void Test(char* testName, TreeNode* pRoot, TreeNode* pNode1, TreeNode* pNode2, TreeNode* pExpected){ if(testName != NULL) printf("%s begins: \n", testName); TreeNode* pResult = GetLastCommonParent(pRoot, pNode1, pNode2); if((pExpected == NULL && pResult == NULL) || (pExpected != NULL && pResult != NULL && pResult->m_nValue == pExpected->m_nValue)) printf("Passed.\n"); else printf("Failed.\n");}// 形状普通的树// 1// / \// 2 3// / \// 4 5// / \ / | \// 6 7 8 9 10void Test1(){ TreeNode* pNode1 = CreateTreeNode(1); TreeNode* pNode2 = CreateTreeNode(2); TreeNode* pNode3 = CreateTreeNode(3); TreeNode* pNode4 = CreateTreeNode(4); TreeNode* pNode5 = CreateTreeNode(5); TreeNode* pNode6 = CreateTreeNode(6); TreeNode* pNode7 = CreateTreeNode(7); TreeNode* pNode8 = CreateTreeNode(8); TreeNode* pNode9 = CreateTreeNode(9); TreeNode* pNode10 = CreateTreeNode(10); ConnectTreeNodes(pNode1, pNode2); ConnectTreeNodes(pNode1, pNode3); ConnectTreeNodes(pNode2, pNode4); ConnectTreeNodes(pNode2, pNode5); ConnectTreeNodes(pNode4, pNode6); ConnectTreeNodes(pNode4, pNode7); ConnectTreeNodes(pNode5, pNode8); ConnectTreeNodes(pNode5, pNode9); ConnectTreeNodes(pNode5, pNode10); Test("Test1", pNode1, pNode6, pNode8, pNode2);}// 树退化成一个链表// 1// /// 2// /// 3// /// 4// /// 5void Test2(){ TreeNode* pNode1 = CreateTreeNode(1); TreeNode* pNode2 = CreateTreeNode(2); TreeNode* pNode3 = CreateTreeNode(3); TreeNode* pNode4 = CreateTreeNode(4); TreeNode* pNode5 = CreateTreeNode(5); ConnectTreeNodes(pNode1, pNode2); ConnectTreeNodes(pNode2, pNode3); ConnectTreeNodes(pNode3, pNode4); ConnectTreeNodes(pNode4, pNode5); Test("Test2", pNode1, pNode5, pNode4, pNode3);}// 树退化成一个链表,一个结点不在树中// 1// /// 2// /// 3// /// 4// /// 5void Test3(){ TreeNode* pNode1 = CreateTreeNode(1); TreeNode* pNode2 = CreateTreeNode(2); TreeNode* pNode3 = CreateTreeNode(3); TreeNode* pNode4 = CreateTreeNode(4); TreeNode* pNode5 = CreateTreeNode(5); ConnectTreeNodes(pNode1, pNode2); ConnectTreeNodes(pNode2, pNode3); ConnectTreeNodes(pNode3, pNode4); ConnectTreeNodes(pNode4, pNode5); TreeNode* pNode6 = CreateTreeNode(6); Test("Test3", pNode1, pNode5, pNode6, NULL);}// 输入NULLvoid Test4(){ Test("Test4", NULL, NULL, NULL, NULL);}int main(){ Test1(); Test2(); Test3(); Test4(); return 0;}==参考剑指offer
0 0
- 最后一题:树中两个节点的最低公共祖先
- 树中两个节点的最低公共祖先
- 树中两个节点的最低公共祖先
- 找出树中两个节点的最低公共祖先
- 二叉树中查找两个节点的最低公共祖先
- 树中两个节点的最低公共祖先
- 剑指offer-树中两个节点的最低公共祖先
- 求二叉树中两个节点的最低公共祖先
- 二叉树中两个节点的最低公共祖先
- 树中两个节点的最低公共祖先
- 剑指offer-树中两个节点的最低公共祖先
- 求二叉树中两个节点的最低公共祖先
- 查找树中两个节点的最低公共祖先
- 树中两个节点的最低公共祖先(剑指offer)
- 树中两个节点最低公共祖先系列算法
- 求树中两个节点的最低公共祖先
- LCA树两个节点最低公共祖先
- 求二叉树中两个节点p,q的最低公共祖先节点
- C#扩展方法的理解
- Linux - 操作文件与目录(manipulating files and directories)
- JSON教程之GSON基本解析(Gson-Java)
- C(.net)中使用jQuery的POST方法提交中文乱码的处理
- MVC设计模式
- 最后一题:树中两个节点的最低公共祖先
- 第二周作业---判断一个正整数是否为质数的算法
- HDOJ-1228-A+B
- google api 地图搜索应用
- TopCoder SRM 612 DIV1 900
- Linux常识:系统负载Load average
- 九度 1389
- 2520 我是菜鸟,我怕谁
- 《深入理解Android:Wi-Fi,NFC和GPS》章节连载[节选]--第七章 深入理解Wi-Fi P2P