第15 题:题目:输入一颗二元查找树,将该树转换为它的镜像
2011-07-26 13:19
429 查看
第15 题:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
定义二元查找树的结点为:
7
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
};
循环方法我们可以使用栈 或者 队列,将节点出栈/队列,将其左右孩子入栈/队列,
下面代码中使用的是栈结构。
代码:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
定义二元查找树的结点为:
7
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 <vector> #include <iostream> using namespace std; struct BSTreeNode { void reverseWithRecursion() //递归 { BSTreeNode *temp = m_pLeft; m_pLeft = m_pRight; m_pRight = temp; if (m_pLeft) m_pLeft->reverseWithRecursion(); if (m_pRight) m_pRight->reverseWithRecursion(); } void reverseWithRecurrence() //循环 { std::vector<BSTreeNode *> stack; BSTreeNode *temp = m_pLeft; m_pLeft = m_pRight; m_pRight = temp; if (m_pLeft) stack.push_back(m_pLeft); if (m_pRight) stack.push_back(m_pRight); while(stack.size() > 0) { BSTreeNode *node = stack[stack.size() - 1]; BSTreeNode *tempChild = node->m_pLeft; node->m_pLeft = node->m_pRight; node->m_pRight = tempChild; stack.pop_back(); if (node->m_pLeft) stack.push_back(node->m_pLeft); if (node->m_pRight) stack.push_back(node->m_pRight); } } void printTree() { cout << m_nValue << endl; std::vector<BSTreeNode *> stack; if (m_pLeft) stack.push_back(m_pLeft); if (m_pRight) stack.push_back(m_pRight); while(stack.size() > 0) { BSTreeNode *node = stack[0]; cout << node->m_nValue << endl; stack.erase(stack.begin()); if (node->m_pLeft) stack.push_back(node->m_pLeft); if (node->m_pRight) stack.push_back(node->m_pRight); } } int m_nValue; BSTreeNode *m_pLeft; BSTreeNode *m_pRight; }; int main(void) { BSTreeNode node[12]; node[8].m_nValue = 8; node[8].m_pLeft = &node[6]; node[8].m_pRight = &node[10]; node[6].m_nValue = 6; node[6].m_pLeft = &node[5]; node[6].m_pRight = &node[7]; node[10].m_nValue = 10; node[10].m_pLeft = &node[9]; node[10].m_pRight = &node[11]; node[5].m_nValue = 5; node[5].m_pLeft = NULL; node[5].m_pRight = NULL; node[7].m_nValue = 7; node[7].m_pLeft = NULL; node[7].m_pRight = NULL; node[9].m_nValue = 9; node[9].m_pLeft = NULL; node[9].m_pRight = NULL; node[11].m_nValue = 11; node[11].m_pLeft = NULL; node[11].m_pRight = NULL; node[8].reverseWithRecurrence(); node[8].printTree(); system("pause"); return 0; }
相关文章推荐
- 第15 题: 题目:输入一颗二元查找树,将该树转换为它的镜像,
- 13. 微软面试题:题目:输入一颗二元查找树,将该树转换为它的镜像
- 题目:输入一颗二元查找树,将该树转换为它的镜像,
- 【编程题目】输入一颗二元查找树,将该树转换为它的镜像
- 微软算法100道题-----输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点
- 【算法】输入一颗二元查找树,将该树转换为它的镜像
- 微软算法100道题-----输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点
- 输入一颗二元查找树,将该树转换为它的镜像
- 15 输入一颗二元查找树,将该树转换为它的镜像
- 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点
- 【微软100题】输入一颗二元查找树,将该树转换为它的镜像
- 15.输入一颗二元查找树,将该树转换为它的镜像
- 【练习】输入一颗二元查找树,将该树转换为它的镜像
- No15、输入一颗二元查找树,将该树转换为它的镜像
- No15_输入一颗二元查找树,将该树转换为它的镜像,
- 输入一颗二元查找树,将该树转换为它的镜像
- C语言实现输入一颗二元查找树并将该树转换为它的镜像
- 输入一颗二元查找树,将该树转换为它的镜像
- 输入一颗二元查找树,将该树转换为它的镜像
- [编程之美-06]输入一颗二元查找树将该树转换为它的镜像