二叉树求两结点的最近公共祖先(包含二叉树按值查找结点)

二叉树求两结点的最近公共祖先(包含二叉树按值查找结点)

在看王道数据结构复习书的时候看到了这道题,发现它有一点逻辑问题(我可能买的是个盗版。。。。)

王道上面给的思想是:后序遍历二叉树,根压在栈底,最后访问。设p在q的左边。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈s中所有元素均为该结点的祖先。

  1. 后序遍历先遍历到p
  2. 将栈复制到辅助栈s1
  3. 继续遍历到结点q时
  4. s从栈顶开始逐个与s1中去匹配
  5. 第一个匹配的元素就是这俩结点的最近公共祖先。

王道提供的答案:

typedef struct
{
	BiTree t;
	int tag;//tag=0表示左子女已被访问,tag=1表示右子女已被访问 
}Bistack;//栈内存放二叉树结点 
BiTree Ancestor(BiTree ROOT,BiNode *p,BiNode *q)
{
	top=0;bt=ROOT;
	while(bt!=NULL||top>0)//1
	{
		while(bt!=NULL&&bt!=p&&bt!=q)//这一步有出入,因为p=4时不会进入循环,bt==p,不会入栈
		{//***这一步会改!!!!!!!!!!***//1.1步
			s[++top].t=bt;
			s[top].tag=0;
			bt=bt->lchild;
		}
		while(top!=0&&s[top].tag==1)//***

你可能感兴趣的:(二叉树求最近公共祖先结点,二叉树按值查找结点)