您的位置:首页 > 其它

翻转2元搜索树(镜像)这两种思路

2015-08-26 11:11 274 查看

问题叙述性说明:

输入搜索树2元,树被转换为它的镜面。

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

算法:

測试用例:

10

/ \

5 11

/ \

3 7

/ \ / \

2 4 6 9

/ /

1 8

算法:

有两种思路:

①递归。对树翻转。仅仅需对他的左右子树翻转,再交换左右子树的位置就可以。

②非递归。设置一个队列queue,从根节点開始处理:人节点先入列,当队列非空时,循环进行下面处理:从队列中取出一节点。交换他的左右子树的位置,将它的左右子节点入列(若存在的话)。当队列为空时,返回。

代码实现:

①递归

<p align="left"><pre name="code" class="cpp">template<class T>
void ReverseTree(BinaryTreeNode<T>* t)
{
if (!t)
return;
BinaryTreeNode<T>* temp = new BinaryTreeNode<T>;
temp = t->LeftChild;
t->LeftChild = t->RightChild;
t->RightChild = temp;
ReverseTree(t->LeftChild);
ReverseTree(t->RightChild);
return;
}




非递归:

//非递归
template<class T>
void ReverseTree2(BinaryTreeNode<T>* t)
{
if (!t)
return;
Queue<BinaryTreeNode<T>*> q;
q.Add(t);
BinaryTreeNode<T>* tt = new BinaryTreeNode < T >;
while (!q.IsEmpty())
{
q.Delete(tt);
BinaryTreeNode<T>* temp = new BinaryTreeNode < T >;
temp = tt->LeftChild;
tt->LeftChild = tt->RightChild;
tt->RightChild = temp;
if (tt->LeftChild)
q.Add(tt->LeftChild);
if (tt->RightChild)
q.Add(tt->RightChild);
}
}


输出測试:

InOrder(n10);
cout << endl;
ReverseTree(n10);
InOrder(n10);
cout << endl;

ReverseTree2(n10);
InOrder(n10);
cout << endl;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: