剑指offer————(面试题50)获取任意节点的公共父节点


//求二叉树中两个结点的最低公共祖先结点
//获取结点的路径
bool get_node_path(node* root,node* treenode,deque<node*> &path){
	if(root == NULL){
		return false;
	}
	//如果找到了将结点保存起来
	if(root == treenode){
		path.push_back(root);
		return true;
	}
	//如果没有找到则寻找
	path.push_back(root);
	//看看左子树是否有该节点
	bool found = get_node_path(root->left,treenode,path);
	//如果左子树没有找到该节点,则在右子树中寻找
	if(!found)
		found = get_node_path(root->right,treenode,path);
	//如果左右子树都没找到,则将之前保留的数据从容器中删除
	if(!found)
		path.pop_back();
	//返回寻找的结果0
	return found;
}
//获得公共节点
node* get_common_node(node* root,deque<node*> &pathA,deque<node*> &pathB){
	if(root == NULL){
		return NULL;
	}else if(!root->left && !root->right){
		return root;
	}

	deque<node*>::iterator iterA = pathA.begin();
	deque<node*>::iterator iterB = pathB.begin();
	node* common_node = NULL;
	while(iterA!=pathA.end() && iterB!=pathB.end()){
		if(*iterA == *iterB){
			common_node = *iterA;
		}
		iterA++;
		iterB++;
	}
	return common_node;
}
//整合函数
node* getLastParent(node* root,node* A,node* B){
	deque<node*> resultA;
	deque<node*> resultB;
	node* common;
	if(get_node_path(root,A,resultA) &&
		get_node_path(root,B,resultB)){
			common = get_common_node(root,resultA,resultB);
	}
	return common;
}
测试:

int main(){
	node *root = new node(9);
	root->left = new node(4);
	root->left->left = new node(1);
	root->left->right = new node(5);

	root->right = new node(15);
	root->right->left = new node(10);
	root->right->right = new node(17);
	root->right->right->left = new node(16);
	
	node *q = getLastParent(root,root->left,root->left);
	if(!q)
		cout<<q->key<<endl;
	system("pause");
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值