题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/
\
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7
5
二分查找树的节点数据结构为:
1 struct BinaryTreeNode 2 { 3 int nData; 4 5 BinaryTreeNode *lChild; 6 BinaryTreeNode *rChild; 7 };
思路:很简单,每次交换根节点的左右子树直到也节点即可,直接上代码.
递归方法:
1 void ChangeToMirror_Recursive(BinaryTreeNode *root) 2 { 3 if (NULL == root) 4 { 5 return; 6 } 7 8 // 交换当前根节点的左右子树 9 BinaryTreeNode *pTemp = root->lChild; 10 root->lChild = root->rChild; 11 root->rChild = pTemp; 12 13 // 递归左子树 14 ChangeToMirror_Recursive (root->lChild); 15 16 // 递归右子树 17 ChangeToMirror_Recursive (root->rChild); 18 }
非递归方法:
1 void ChangeToMirror(BinaryTreeNode *root) 2 { 3 assert (root != NULL); 4 5 BinaryTreeNode *Stack[MAX]; 6 int nTop = -1; 7 8 Stack[++nTop] = root; 9 while (nTop >= 0) 10 { 11 // 首先取出栈顶的节点,交换其左右子树 12 BinaryTreeNode *pTemp1 = Stack[nTop--]; 13 14 BinaryTreeNode *pTemp2 = pTemp1->lChild; 15 pTemp1->lChild = pTemp1->rChild; 16 pTemp1->rChild = pTemp2; 17 18 if (pTemp1->lChild != NULL) 19 { 20 // 左子树不为空需要处理 21 Stack[++nTop] = pTemp1->lChild; 22 } 23 24 if (pTemp1->rChild != NULL) 25 { 26 // 右子树不为空需要处理 27 Stack[++nTop] = pTemp1->rChild; 28 } 29 } 30 }