두 갈래 나무에서 두 개의 결점을 찾는 최근 공공 조상의 결점

1. 두 갈래 나무 검색: 첫 번째 변종은 두 갈래 나무는 특수한 두 갈래 나무이다. 두 갈래 나무를 찾아라.즉, 나무는 정렬된 것이다. 왼쪽 나무에 있는 결점은 모두 아버지 결점보다 작고, 오른쪽 나무에 있는 결점은 모두 아버지 결점보다 크다.우리는 단지 뿌리 결점부터 두 결점과 비교하기만 하면 된다.현재 결점의 값이 두 결점보다 크면 가장 낮은 공통 부모 결점은 현재 결점의 왼쪽 트리에 있습니다.현재 결점의 값이 두 결점보다 작으면 가장 낮은 공통 부모 결점은 현재 결점의 오른쪽 트리에 있습니다.(4<5 7>5)
2. 삼차 체인(부부 노드를 찾을 수 있음): 4개 노드에서 루트 결점까지 두루 돌아다니며 첫 번째와 7개 결점에서 루트 결점까지의 경로가 겹치는 결점을 찾아낸다.(각각 4, 3, 5, 10이 7-8-5-10에 있는지, 5가 가장 먼저 겹치기 때문에 5가 4와 7 조상의 결점이다)
3. 일반 두 갈래 나무: 먼저 뿌리 결점을 찾아 a, b 결점까지의 경로를 반복해서 수조에 저장한 다음에 두 수조를 반복해서 두 수조의 첫 번째 다른 결점의 이전 결점을 찾아낸다.
#pragma once
#include 
using namespace std;
#include 

struct Node
{
	Node* left;
	Node *right;
	int value;
	Node(int v)
		:left(NULL)
		,right(NULL)
		,value(v)
	{}
};
bool GetPath(Node *root,vector&path,Node* x)
{
	if (root == NULL)
	{
		return false;
	}
	path.push_back(root);
	if (root == x)
	{
		return true;
	}
	if (GetPath(root->left, path, x))
	{
		return true;
	}
	if (GetPath(root->right, path, x))
	{
		return true;
	}
	else
	{
		path.pop_back();
		return false;
	}
}
Node* find_common_parent(Node* root, Node* a, Node* b)
{
	if (root == NULL)
	{
		return NULL;
	}
	Node* common_parent = NULL;

	vector va, vb;
	GetPath(root, va, a);
	GetPath(root, vb, b);
	size_t i = 0;
	while (i < va.size() && i < vb.size() && va[i] == vb[i])
	{
		common_parent = va[i];
		i++;
	}
	return common_parent;

}

좋은 웹페이지 즐겨찾기