打印item的祖先结点

1.链式存储
思路:用栈保存每个结点的祖先结点,如果结点的值为item,打印结果。
代码思路:

void ANCESTOR(BTREE T,int item)
{
	BTREE STACK1[NodeNum],p = T;
	int STACK2[NodeNum],top=-1,flag;
	if(T!=NULL && T->data!=item)
	{
		//do
		while(p || top != -1)
		{
			//将左子树入栈STACK1
			//左子树标志为0,右子树标志为1
			//标志位入栈STACK2
			while(p!=NULL)
			{
				STACK1[++top] = p;
				STACK2[top] = 0;
				p=p->lchild;
			}
			p=STACK1[top];
			flag=STACK2[top--];
			//是左孩子时,将自己和右孩子入栈
			if(flag==0)
			{
				STACK1[++top] = p;
				STACK2[top] = 1;
				p=p->rchild;
			}
			//已经访问过
			else
			{
				if(p->data == item)
				{
					while(top != -1)
					{
						printf("%4d",STACk1[top--]->data);
					}
					break;
				}
				else
					p=NULL;
			}

		}
	}
}
void AncestorX(BiTNode* T,ElemType x)
{
    SqStack S;
    InitStack(&S);

    BiTNode* p=T;
    BiTNode* r=NULL;

    while(p||IsEmptyStack(&S))
    {
        if(p!=NULL)
        {
            Push(&S,p);
            p=p->lchild;
        }
        else
        {
            p=GetTop(&S);
            if(p->rchild!=NULL&&p->rchild!=r)
            {
                p=p->rchild;
                Push(&S,p);
                p=p->lchild;
            }
            else
            {
                p=Pop(&S);
                if(p->data==x)
                {
                    while(IsEmptyStack(&S)!=0)
                    {
                        p=Pop(&S);
                        printf("%c",p->data);
                    }
                }
                r=p;
                p=NULL;
            }
        }
    }   
}

2.顺序存储
思路:
1.找到item在位置i;
2.打印i/2的结点;
3.如果i!=0,执行2;
4.最后打印根节点。

参考:https://blog.csdn.net/u013595419/article/details/52159821

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值