二叉搜索树中任意两个节点的最近共同父父节点1(LCA问题)
2013-09-06 16:59
267 查看
#include <iostream> using namespace std; struct Node{ int value; Node *pLeft; Node *pRight; }; Node *CreateNode(int v) { Node *pNode = new Node(); if (!pNode) return NULL; pNode->value = v; pNode->pLeft = NULL; pNode->pRight = NULL; return pNode; } void LinkNode(Node *root, Node *pLeftChildNode, Node *pRightChildNode) { root->pLeft = pLeftChildNode; root->pRight = pRightChildNode; } Node *LCA(Node *root, Node *p, Node *q) { if (!root || !p || !q) // 如果是叶子节点的空孩子,那么返回NULL return NULL; if (root == p || root == q) // 如果当前节点是p或者q,那么返回当前节点(这还不是LCA,上层的LCA节点会返回LCA自己的) return root; // 以下包括好几层意思: // 1、如果a b都存在,那么说明p q在不同的子树中,说明是root是LCA // 2、如果a b都是NULL,说明root的子树里没有p q,那么返回NULL // 3、如果a b仅一个存在,那么就向上返回这仅有的一个(这个有可能是LCA,也有可能不是): // 如果这个是LCA,那么 return a ? a : b; 会一直向上返回,直到root; // 如果这个还不是LCA,那么向上返回直到上层的LCA发现另一棵子树含有另一个节点(逻辑1) Node *a = LCA(root->pLeft, p, q); Node *b = LCA(root->pRight, p, q); if (a && b) return root; return a ? a : b; } int main() { Node *p[8]; p[0] = CreateNode(3); p[1] = CreateNode(5); p[2] = CreateNode(1); p[3] = CreateNode(6); p[4] = CreateNode(2); p[5] = CreateNode(0); p[6] = CreateNode(8); p[7] = CreateNode(7); p[8] = CreateNode(4); if (!p[0] || !p[1] || !p[2] || !p[3] || !p[4] || !p[5] || !p[6] || !p[7] || !p[8]) { cout<<"Create Node Err!"<<endl; return -1; } LinkNode(p[0], p[1], p[2]); LinkNode(p[1], p[3], p[4]); LinkNode(p[2], p[5], p[6]); LinkNode(p[4], p[7], p[8]); Node *pLCA = LCA(p[0], p[0], p[2]); Node *pLCA2 = LCA(p[0], NULL, NULL); if (pLCA) cout<<"pLCA->value = "<<pLCA->value<<endl; else cout<<"Error"<<endl; if (pLCA2) cout<<"pLCA2->value = "<<pLCA2->value<<endl; else cout<<"Error"<<endl; return 0; }参考文献:http://leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html
相关文章推荐
- 二叉搜索树中任意两个节点的最近共同父父节点2(LCA问题)
- LCA问题:求二叉树中任意两个节点的最近公共祖先
- 两个节点最近公共祖先问题(LCA问题)极客
- 求满二叉树上任意两个节点的最近公共父节点
- git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
- 二叉树——查找两个任意节点的最近祖先
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先
- 查找二叉树某两个节点最近的共同祖先及改进方法
- 二叉树中任意两个节点的最近公共祖先节点
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- [算法 笔记] 查找二叉树上任意两个结点的最近共同祖先(更新版本)
- 二叉树问题——寻找二叉树中两个节点的最近公共祖先
- 求二叉树任意两个结点最近的共同祖先
- 求二叉树上任意两个节点的最近公共父节点
- 二叉树问题---在二叉树中找到两个节点的最近公共节点
- 二叉树,给定任意两个节点,寻找最近的父节点
- 【算法面试题】寻找二叉搜索树中两个节点的最近公共祖先节点(转)
- 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。
- 二叉搜索树(BST)的最近公共祖先(LCA)问题(Lowest Common Ancestor of a Binary Tree)