算法导论 练习题 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;
			}

		}
	}
}

你可能感兴趣的:(算法导论)