编程算法 - 二叉树的最低公共祖先 代码(C)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程算法 - 二叉树的最低公共祖先 代码(C)相关的知识,希望对你有一定的参考价值。

二叉树的最低公共祖先 代码(C)


本文地址: http://blog.csdn.net/caroline_wendy


二叉树的最低公共祖先(lowest common ancestor), 首先先序遍历找到两个结点的路径, 然后依据链表路径找到最低的公共祖先.


代码:

/*
 * main.cpp
 *
 *  Created on: 2014.6.12
 *      Author: Spike
 */

/*eclipse cdt, gcc 4.8.1*/

#include <iostream>
#include <list>
#include <queue>

using namespace std;

struct BinaryTreeNode {
	BinaryTreeNode(int _value) {
		value = _value;
		left = NULL;
		right = NULL;
	}

	int value;
	BinaryTreeNode* left;
	BinaryTreeNode* right;
};

void printTree (BinaryTreeNode* tree)
{
	BinaryTreeNode* node = tree;
	std::queue<BinaryTreeNode*> temp1;
	std::queue<BinaryTreeNode*> temp2;

	temp1.push(node);

	while (!temp1.empty())
	{
		node = temp1.front();
		if (node->left != NULL) {
			temp2.push(node->left);
		}

		if (node->right != NULL) {
			temp2.push(node->right);
		}

		temp1.pop();

		std::cout << node->value  << " ";

		if (temp1.empty())
		{
			std::cout << std::endl;
			temp1 = temp2;
			std::queue<BinaryTreeNode*> empty;
			std::swap(temp2, empty);
		}
	}
}

BinaryTreeNode* buildTree (void)
{
	BinaryTreeNode* root = new BinaryTreeNode(1);
	BinaryTreeNode* node2 = new BinaryTreeNode(2);
	BinaryTreeNode* node3 = new BinaryTreeNode(3);
	BinaryTreeNode* node4 = new BinaryTreeNode(4);
	BinaryTreeNode* node5 = new BinaryTreeNode(5);
	BinaryTreeNode* node6 = new BinaryTreeNode(6);
	BinaryTreeNode* node7 = new BinaryTreeNode(7);
	BinaryTreeNode* node8 = new BinaryTreeNode(8);
	BinaryTreeNode* node9 = new BinaryTreeNode(9);
	BinaryTreeNode* node10 = new BinaryTreeNode(10);

	root->left = node2;
	root->right = node3;

	node2->left = node4;
	node2->right = node5;

	node4->left = node6;
	node4->right = node7;

	node5->left = node8;
	node5->right = node9;

	node9->left = node10;

	return root;
}

bool GetNodePath(BinaryTreeNode* root, int v, vector<BinaryTreeNode*>& path) {
	if (root->value == v)
		return true;
	path.push_back(root);
	bool found = false;
	if (root->left != NULL && !found)
		found = GetNodePath(root->left, v, path);
	if (root->right != NULL && !found)
		found = GetNodePath(root->right, v, path);
	if (!found)
		path.pop_back();
	return found;
}

BinaryTreeNode* GetLastCommonNode (
		const vector<BinaryTreeNode*>& path1, const vector<BinaryTreeNode*>& path2)
{
	vector<BinaryTreeNode*>::const_iterator it1 = path1.begin();
	vector<BinaryTreeNode*>::const_iterator it2 = path2.begin();
	BinaryTreeNode* pLast = NULL;
	while (it1 != path1.end() && it2 != path2.end()) {
		if ((*it1)->value == (*it2)->value)
			pLast = *it1;
		it1++;
		it2++;
	}
	return pLast;
}

BinaryTreeNode* GetLastCommonParent(BinaryTreeNode* root, int v1, int v2)
{
	if (root == NULL)
		return NULL;
	vector<BinaryTreeNode*> path1;
	GetNodePath(root, v1, path1);
	vector<BinaryTreeNode*> path2;
	GetNodePath(root, v2, path2);

	return GetLastCommonNode(path1, path2);
}

int main (void)
{
	BinaryTreeNode* root = buildTree();
	int v1 = 6;
	int v2 = 10;
	BinaryTreeNode* common = GetLastCommonParent(root, v1, v2);
	cout << "common node : " << common->value << endl;
	return 0;
}


输出:

common node : 2



技术分享
















以上是关于编程算法 - 二叉树的最低公共祖先 代码(C)的主要内容,如果未能解决你的问题,请参考以下文章

总结所有有关二叉树公共祖先问题

[编程题] lc[236. 二叉树的最近公共祖先]

代码随想录算法训练营第14天|530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236.二叉树的最近公共祖先

python代码实现二叉树中最低的公共祖先

LeetCode(算法)- 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先[中等]