ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
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 }
posted on 2013-05-01 15:56  ldjhust  阅读(179)  评论(0编辑  收藏  举报