查詢排序二叉樹的最小值,最大值,Next指標,並逆序列印

衣兜發表於2020-11-29

給出一個排序二叉樹,求它的最小值,最大值,Next域

思路:一個排序二叉樹,如果要將它從小到大排序,只需要按照中序遍歷規則列印即可。那麼它的第一個元素就是它的最小值,而最後一個元素就是他的最大值。
最小值:

BstNode* First(BtNode* ptr)
{
	while(ptr!=NULL&&ptr->left!=NULL)
	{
		ptr=ptr->left;
	}
	return ptr;
}

最大值:

BstNode* Last(BstNode* ptr)
{
	while(ptr!=NULL&&ptr->right!=NULL)
	{
		ptr=ptr->right;
	}
	return ptr;
}

Next域:

BstNode* Next(BstNode* ptr)
{
	if(ptr==NULL)//空樹,不做操作
	{
		return NULL;
	}
	if(ptr->right!=NULL)
	{
	//如果ptr的右孩子不為空,那麼就把它的右孩子看作另一顆樹的根節點,找到它的最小值,這個最小值就是ptr的下一個元素
		return First(ptr->right);
	}
	else{
		BstNode* pa=ptr->parent;//定義一個pa指向ptr的雙親
		while(pa!=NULL&&pa->left!=ptr)//當他的雙親不為空並且雙親的左孩子不等於ptr時
		{
			ptr=pa;//ptr指向它的雙親
			pa=pa->parent;//雙親指向它的雙親,一直到根節點為止
		}
		return pa;//當它的雙親不為空且雙親的左孩子等於ptr時,找到這個節點
	}
}

利用上面的函式升序列印這棵樹

void NiceInOrder(BSTree& myt)
{
	for(BstNode* p=First(myt.root);p!=NULL;p=Next(p))
	{
		cout<<p->data<<" ";
	}
	cout<<endl;
}

降序列印這棵樹

BstNode* Prev(BstNode* ptr)
{
	if(ptr==NULL)
	{
		return NULL;
	}
	if(ptr->left!=NULL)
	{
		ptr=ptr->left;
	}
	else
	{
		BstNode* pa=ptr->parent;
		while(pa!=NULL&&pa->right!=ptr)
		{
		ptr=pa;
		pa=pa->parent;
		}
		return pa;
	}
}

降序列印也就是逆序列印

void ResNiceInOrder(BstNode& myt)
{
	for(BstNode* p=Last(Myt.root);p!=NULL;p=Prev(p))
	{
		cout<<p->data;
	}
	cout<<endl;
}

相關文章