首页 > 代码库 > 【编程题目】输入一颗二元查找树,将该树转换为它的镜像

【编程题目】输入一颗二元查找树,将该树转换为它的镜像

第 15 题(树):
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
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 /*  2 第 15 题(树):  3 题目:输入一颗二元查找树,将该树转换为它的镜像,  4 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。  5 用递归和循环两种方法完成树的镜像转换。   6 例如输入:  7 8  8 /   9 6 10 10 / \ /   11 5 7  9 11 12 输出: 13 8 14 /     15 10    6 16 / \    /   17 11 9 7 5 18 定义二元查找树的结点为: 19 struct BSTreeNode // a node in the binary search tree (BST) 20 { 21 int m_nValue; // value of node 22 BSTreeNode *m_pLeft; // left child of node 23 BSTreeNode *m_pRight; // right child of node 24 }; 25  26 start time = 17:55 27 end time = 18:51 28 */ 29  30  31 //思路 后序遍历 32 #include <iostream> 33 #include <vector> 34 using namespace std; 35  36 typedef struct BSTreeNode // a node in the binary search tree (BST) 37 { 38 int m_nValue; // value of node 39 BSTreeNode *m_pLeft; // left child of node 40 BSTreeNode *m_pRight; // right child of node 41 }BSTreeNode; 42  43 int addBSTreeNode(BSTreeNode * &T, int data)  //把data加入的以T为根的树中 44 { 45     if(T == NULL) //根节点单独处理 46     { 47         T = (BSTreeNode *)malloc(sizeof(BSTreeNode)); 48         T->m_nValue =http://www.mamicode.com/ data; 49         T->m_pLeft = NULL; 50         T->m_pRight = NULL; 51     } 52     else 53     { 54         BSTreeNode * x = T; 55         BSTreeNode * px = NULL; 56         while(x != NULL) 57         { 58             if(data >= x->m_nValue) 59             { 60                 px = x; 61                 x = x->m_pRight; 62             } 63             else 64             { 65                 px = x; 66                 x = x->m_pLeft; 67             } 68         } 69  70         if(data >= px->m_nValue) 71         { 72             px->m_pRight = (BSTreeNode *)malloc(sizeof(BSTreeNode)); 73             px->m_pRight->m_nValue =http://www.mamicode.com/ data; 74             px->m_pRight->m_pLeft = NULL; 75             px->m_pRight->m_pRight = NULL; 76         } 77         else 78         { 79             px->m_pLeft = (BSTreeNode *)malloc(sizeof(BSTreeNode)); 80             px->m_pLeft->m_nValue =http://www.mamicode.com/ data; 81             px->m_pLeft->m_pLeft = NULL; 82             px->m_pLeft->m_pRight = NULL; 83         } 84     } 85     return 1; 86 } 87  88 int RecursiveMirror(BSTreeNode * T) 89 { 90     if(T == NULL) 91     { 92         return 0; 93     } 94     else 95     { 96         RecursiveMirror(T->m_pLeft); 97         RecursiveMirror(T->m_pRight); 98         BSTreeNode * x = T->m_pLeft; 99         T->m_pLeft = T->m_pRight;100         T->m_pRight = x;101     }102 }103 104 int NonRecursiveMirror(BSTreeNode * T)105 {106     vector<BSTreeNode *> stack;107     int tag[50] = {0};108     int tagnum = 0;109     BSTreeNode * x = T;110     stack.push_back(T);111     while(!stack.empty())112     {113         while((x = stack.back()) != NULL)114         {115             x = x->m_pLeft;116             stack.push_back(x);117             tag[tagnum++] = 0;118         }119         while(tag[tagnum - 1] == 1) //注意先判断是否处理数据 再弹出120         {121             stack.pop_back();122             tagnum--;123             BSTreeNode * cur = stack.back();124             BSTreeNode * tmp = cur->m_pLeft;125             cur->m_pLeft = cur->m_pRight;126             cur->m_pRight = tmp;127             128         }129         stack.pop_back();130         tagnum--;131         if(!stack.empty()) //注意这里的条件132         {133             stack.push_back(stack.back()->m_pRight);134             tag[tagnum++] = 1;135         }136 137     }138     return 1;139 }140 int main()141 {142     BSTreeNode * T = NULL;143     addBSTreeNode(T, 8);144     addBSTreeNode(T, 6);145     addBSTreeNode(T, 10);146     addBSTreeNode(T, 5);147     addBSTreeNode(T, 7);148     addBSTreeNode(T, 9);149     addBSTreeNode(T, 11);150 151     NonRecursiveMirror(T);152     RecursiveMirror(T);153     return 1;154 }
View Code

 

上网搜答案,发现先序遍历也可以。而且先序遍历要比后序遍历写起来容易些。