算法习题15:二叉树镜像(翻转)

来源:互联网 发布:类似sai mac 编辑:程序博客网 时间:2024/06/07 01:16

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

今天这两道题相对来说还是比较简单,怪不得连答案都没咯

镜像,就是交换左右子树,正如我前面题目里遇到的一样,二叉树这种问题最便捷的就是回归到递归遍历问题上,这样解题就思路开阔了

//============================================================================// Name        : RevertBT.cpp// Author      : YLF// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>using namespace std;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};void addNode(BSTreeNode* &p, int value);void printLDR(BSTreeNode* p);void Mirror(BSTreeNode* p);int main() {BSTreeNode *head = NULL;int input = 0;while(true){cin>>input;if(input != -1)addNode(head, input);elsebreak;}printLDR(head);cout<<endl;Mirror(head);printLDR(head);return 0;}void addNode(BSTreeNode* &p, int value){if(p == NULL){BSTreeNode* temp = new BSTreeNode();temp->m_nValue = value;temp->m_pLeft = NULL;temp->m_pRight = NULL;p = temp;}else{if(value < p->m_nValue)addNode(p->m_pLeft, value);else{addNode(p->m_pRight, value);}}}/* * 翻转镜像 */void Mirror(BSTreeNode* p){if(p == NULL)return;//先镜像BSTreeNode* temp = p->m_pLeft;p->m_pLeft = p->m_pRight;p->m_pRight = temp;//再遍历Mirror(p->m_pLeft);Mirror(p->m_pRight);}/* * 中序遍历 */void printLDR(BSTreeNode* p){if(p == NULL)return;printLDR(p->m_pLeft);cout<<p->m_nValue<<" ";printLDR(p->m_pRight);}


原创粉丝点击