即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
分析:该题的本质就是更换每个节点的左后子树
递归算法:
1 void ExchangeTree(BinTree BT){ 2 if(BT){ 3 . ExchangeTree(BT->lchild); 4 ExchangeTree(BT->rchild); 5 BinTree temp=BT->lchild; 6 BT->lchild=BT->rchild; 7 BT->rchild=tempk; 8 } 9 }
循环算法,非递归算法:
采用先序遍历:
1 void ExchangTree(BinTree BT){ 2 Stack S; 3 BinTree p=BT; 4 while(p!=NULL||!isEmptyStack(S)){ 5 if(p!=NULL){ 6 BinTree temp=p->lchild; 7 p->lchild=p->rchild; 8 p->rchild=temp 9 Push(S,p); 10 p=p->lchild; 11 }else{ 12 BintTee temp=Top(S); 13 p=temp->rchild; 14 pop(S); 15 } 16 } 17 }