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

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:54   1605   0
//二叉树中两个结点的最低公共祖先
#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;
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP