二叉树中两个结点的最低公共祖先

//二叉树中两个结点的最低公共祖先
#include<iostream>
#include<stack>

using namespace std;
struct binaryTreeNode
{
	int value;
	binaryTreeNode *pLeft;
	binaryTreeNode *pRight;
};

bool getNodePath(binaryTreeNode *pRoot,binaryTreeNode *pTarget,stack<binaryTreeNode *> &path)
{
	if(pRoot==NULL || pTarget==NULL || !path.empty())
	{
		return false;
	}
	//后序遍历
	binaryTreeNode *pNode=pRoot;  
    binaryTreeNode *pLastVisited=NULL;  
  
  
    while( pNode || !path.empty())  
    {  
        if(pNode)  
        {  
            path.push(pNode);  
            pNode=pNode->pLeft;  
        }  
        else  
        {  
            if(pLastVisited==path.top()->pRight)  
            {  
				if(path.top()==pTarget)
					return true;
                pLastVisited=path.top();  
                path.pop();  
            }  
            else  
            {  
                pNode=path.top()->pRight;  
                pLastVisited=NULL;  
            }  
        }  
    }  
	return false;
}

int main()
{
	binaryTreeNode n1,n2,n3,n4,n5,n6,n7,n8;
	n1.value=8,n2.value=6,n3.value=10,n4.value=5,n5.value=7,n6.value=9,n7.value=11,n8.value=20;
	n1.pLeft=&n2,n1.pRight=&n3;
	n2.pLeft=&n4,n2.pRight=&n5;
	n3.pLeft=&n6,n3.pRight=&n7;
	n4.pLeft=NULL,n4.pRight=NULL;
	n5.pLeft=&n8,n5.pRight=NULL;
	n6.pLeft=NULL,n6.pRight=NULL;
	n7.pLeft=NULL,n7.pRight=NULL;
	n8.pLeft=NULL,n8.pRight=NULL;
	binaryTreeNode *pRoot=&n1;
	stack<binaryTreeNode *> path1,path2;
	getNodePath(pRoot,&n4,path1);
	getNodePath(pRoot,&n8,path2);
	stack<binaryTreeNode *> path1_reverse,path2_reverse;
	while(!path1.empty())
	{
		path1_reverse.push(path1.top());
		path1.pop();
	}
	while(!path2.empty())
	{
		path2_reverse.push(path2.top());
		path2.pop();
	}
	binaryTreeNode *lowestCommanAncestor;
	while(!path1_reverse.empty() && !path2_reverse.empty())
	{
		if(path1_reverse.top()==path2_reverse.top())
		{
			lowestCommanAncestor=path1_reverse.top();
			path1_reverse.pop();
			path2_reverse.pop();
		}
		else
		{
			break;
		}
	}
	cout<<lowestCommanAncestor<<endl;
	cout<<lowestCommanAncestor->value<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值