[编程之美-15]输入一颗二元查找树将该树转换为它的镜像

xiaoxiao2021-02-27  209

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。  例如输入:  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 };

我们输出的结果是把镜像的二元树进行中序遍历。

思想:主要结合递归,以及层序遍历的思想,交换当前节点的左右子树。

代码如下:

#include<iostream> #include<stack> using namespace std; struct BSTreeNode { int m_nValue; BSTreeNode *m_pleft; BSTreeNode *m_pright; }; void addBSTreeNode(BSTreeNode *&pCurrent, int value); void reverseBSTree1(BSTreeNode *pRoot); void reverseBSTree2(BSTreeNode *pRoot); void inOrderReverseBSTree(BSTreeNode *pRoot); int main() { BSTreeNode *pRoot = NULL; addBSTreeNode(pRoot, 8); addBSTreeNode(pRoot, 6); addBSTreeNode(pRoot, 5); addBSTreeNode(pRoot, 7); addBSTreeNode(pRoot, 10); addBSTreeNode(pRoot, 9); addBSTreeNode(pRoot, 11); reverseBSTree1(pRoot); //reverseBSTree2(pRoot); inOrderReverseBSTree(pRoot); return 0; } void reverseBSTree1(BSTreeNode *pRoot) { if(pRoot == NULL) return ; BSTreeNode *pCurrent; pCurrent = pRoot->m_pleft; pRoot->m_pleft = pRoot->m_pright; pRoot->m_pright = pCurrent; if(pRoot->m_pleft != NULL) reverseBSTree1(pRoot->m_pleft); if(pRoot->m_pright != NULL) reverseBSTree1(pRoot->m_pright); } void inOrderReverseBSTree(BSTreeNode *pRoot) { if(pRoot == NULL) return ; if(pRoot->m_pleft != NULL) inOrderReverseBSTree(pRoot->m_pleft); cout<<pRoot->m_nValue<<" "; if(pRoot->m_pright != NULL) inOrderReverseBSTree(pRoot->m_pright); } void addBSTreeNode(BSTreeNode *&pCurrent, int value) { if(pCurrent == NULL) { BSTreeNode *pBSTree = new BSTreeNode(); pBSTree->m_nValue = value; pBSTree->m_pleft = NULL; pBSTree->m_pright = NULL; pCurrent = pBSTree; } else { if((pCurrent->m_nValue) > value) addBSTreeNode(pCurrent->m_pleft, value); else if((pCurrent->m_nValue) < value) addBSTreeNode(pCurrent->m_pright, value); } } void reverseBSTree2(BSTreeNode *pRoot) { if(pRoot == NULL) return ; stack<BSTreeNode*> v; v.push(pRoot); while(v.size() != 0) { BSTreeNode *pCurrent = v.top(); v.pop(); BSTreeNode *pTemp; pTemp = pCurrent->m_pleft; pCurrent->m_pleft = pCurrent->m_pright; pCurrent->m_pright = pTemp; if(pCurrent->m_pleft != NULL) v.push(pCurrent->m_pleft); if(pCurrent->m_pright != NULL) v.push(pCurrent->m_pright); } }
转载请注明原文地址: https://www.6miu.com/read-8855.html

最新回复(0)