算法导论 练习题 10.4-5

typedef struct Tree
{
	int key;
	Tree *p;
	Tree *left;
	Tree *right;
}TN,*TNP;

void trav(TNP root)
{
	TNP t =root;
	while(t)
	{
		//向下走的过程,优先左子树
		if(t->left)
		{
			t=t->left;
		}
		//同样是向下走的过程,该节点无左子树,就访问自身节点,继续找右子树
		else if(t->right)
		{
			printf("%d ",t->key);
			t=t->right;
		}		
		else
		{
			//叶子节点,访问自身之后开始向上走		
			printf("%d ",t->key);			
			//一步一步向上走的过程其实也很长呀,需要迭代
			while(1)
			{		
				//这里有几种情况:				
				if(t==t->p->left)
				{
					//1、该叶子是父节点的左孩子,父节点有右子树,那么访问完父节点,接下来应该访问父节点的右子树。
					//这时需要跳出向上走的迭代过程,开始沿着右子树向下走
					if(t->p->right)
					{
						printf("%d ",t->p->key);
						t=t->p->right;
						break;
					}
					//2、该叶子是父节点的左孩子,父节点没有右子树,那么访问完父节点,继续向上走
					else
					{
						printf("%d ",t->p->key);
						t=t->p;
					}
				}
				//该节点是父节点的右孩子,因为右子树是访问完左子树和根之后访问的,所以不需要访问父节点,直接向上走
				else
				{
					t=t->p;				
				}
				//如果向上走到根节点,结束
				if(t==root)
						return;
			}

		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值