【考研02】二叉树非递归遍历

1.二叉树前序非递归遍历

void PreOrder(BTNode *bt)
{
	if(bt != NULL)
	{
		BTNode *Stack[maxSize];
		int top = -1;
		BTNode *p;
		Stack[++top] = bt;
		while(top != -1)
		{
			p = Stack[top--];
			Visit(p);
			if(p->rchild != NULL)
				Stack[++top] = p->rchild;
			if(p->lchild != NULL)
				Stack[++top] = p->lchild;
		}
	}
}

2.二叉树中序非递归遍历

void inorder(BTNode *bt)
{  //开始根节点入栈
   //如果栈顶结点左孩子存在,则左孩子入栈;
   //如果栈顶结点左孩子不存在,则出栈并输出栈顶结点,然后检查其右孩子是否存在
   //如果存在,则右孩子入栈
   //栈空算法结束
	if(bt != NULL)
	{
		BTNode *Stack[maxSize];
		int top = -1;
		BTNode *p;
		p = bt;
		while(top != -1 || p != NULL)
		{
			while(p != NULL)
			{
				Stack[++top] = p;
				p = p->lchild;
			}
			if(top != -1)  //在栈不空的情况下出栈并输出结点
			{
				p = Stack[top--];
				Visit(p);
				p = p->rchild;
			}
		}
	}
}

3.二叉树后序非递归遍历

typedef struct
{
	BTNode *t;
	int tag;
}Stack;
void PostOrder(BTNode *bt)
{
	Stack s[];
	int top = -1;
	while(bt != NULL && top != -1)
	{
		while(bt != NULL)
		{
			++top;
			s[top].t = bt;
			s[top].tag = 0;
			bt = bt->lchild;
		}
		while(top != -1 && s[top].tag == 1)
		{
			Visit(s[top].t);
			--top;
		}
		if(top != -1)
		{
			s[top].tag = 1;
			bt = s[top].t->rchild;
		}
	}
}

4.打印值为x的结点的所有祖先,假设值为x的结点不多于一个

typedef struct
{
	BTNode *t;
	int tag;
}Stack;
void Search(BTNode *bt,int x)
{
	Stack s[];
	int top = -1;
	while(bt != NULL && top != -1)
	{
		while(bt != NULL && bt->data != x)
		{
			++top;
			s[top].t = bt;
			s[top].tag = 0;
			bt = bt->lchild;
		}
		if(bt->data == x)
		{
			printf("所查结点的所有祖先值为:\n");
			for(i=0;i<top;i++)
			{
				printf("%d",s[i].t->data);
			}
			exit(0);  //输出祖先值后结束
		}
		while(top != -1 && s[top].tag == 1)
		{
			--top;
		}
		if(top != -1)
		{
			s[top].tag = 1;
			bt = s[top].t->rchild;
		}
	}
}

5.p和q的最近公共祖先结点r

BTNode* Ancestor(BTNode* root, BTNode* p, BTNode* q) {
		//查找以root为根结点的树上是否有p结点或者q结点,如果有就返回p结点或q结点,否则返回null
        if(root == p || root == q || root == NULL)
        	return root;
        BTNode* left=Ancestor(root->lchild,p,q);
        BTNode* right=Ancestor(root->rchild,p,q);
        //第一种情况:左子树和右子树均找没有p结点或者q结点
        if(left == NULL && right == NULL)
        	return NULL;  
        //第二种情况:左子树上能找到,但是右子树上找不到,此时就应当直接返回左子树的查找结果; 
        else if(left != NULL && right== NULL)
        	return left;
        //第三种情况:右子树上能找到,但是左子树上找不到,此时就应当直接返回右子树的查找结果;
        else if(right != NULL && left == NULL)
        	return right;
        //第四种情况:左右子树上均能找到,说明此时的p结点和q结点分居root结点两侧,此时就应当直接返回root结点了
        else
   	    	return root;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值