面试100题:15.求二叉树的镜像
来源:互联网 发布:ae auto sway mac 编辑:程序博客网 时间:2024/06/06 12:22
转载并参考July的博客http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html,万分感谢!
题目:
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
输入:
8
/ \
6 10
/ \ / \
5 7 9 11
输出:
8
/ \
10 6
/ \ / \
11 9 7 5
分析:
利用递归遍历二叉树的左右子树,分别交换左右孩子。
/*Title: 15.求二叉树的镜像Author: gocodeDate: 2012-10-16*/ #include <iostream>#include <stack>using namespace std; typedef struct Node{ int m_Data; Node* m_pLeft; Node* m_pRight;} Node, BSTNode; BSTNode* Root; // 递归求镜像void SeekBSTMirror(BSTNode* root){ if(NULL == root) return; if(NULL != root->m_pLeft) SeekBSTMirror(root->m_pLeft); if(NULL != root->m_pRight) SeekBSTMirror(root->m_pRight); // 左右孩子交换 if(NULL != root->m_pLeft && NULL != root->m_pRight) { BSTNode* tempNode = root->m_pLeft; root->m_pLeft = root->m_pRight; root->m_pRight = tempNode; } // 左叶子变右叶子 if(NULL != root->m_pLeft && NULL == root->m_pRight) { BSTNode* pNewRightNode = new BSTNode(); pNewRightNode = root->m_pLeft; root->m_pLeft = NULL; delete root->m_pLeft; root->m_pRight = pNewRightNode; } // 右叶子变左叶子 if(NULL == root->m_pLeft && NULL != root->m_pRight) { BSTNode* pNewLeftNode = new BSTNode(); pNewLeftNode = root->m_pRight; root->m_pRight = NULL; delete root->m_pRight; root->m_pLeft = pNewLeftNode; }} // 循环求镜像BSTNode* SeekBSTMirror2(BSTNode* root){ if(root != NULL) { stack<BSTNode *> stk; //辅助栈 stk.push(root); //压入根结点 while(stk.size()) { BSTNode *pNode = stk.top(); BSTNode *pLeft = pNode->m_pLeft; BSTNode* pRight = pNode->m_pRight; stk.pop(); if(pLeft != NULL) stk.push(pLeft); if(pRight != NULL) stk.push(pRight); pNode->m_pLeft = pRight; //交换左右子女 pNode->m_pRight = pLeft; } } return root;} // 创建二叉树void AddBSTNode(BSTNode* &pCur, int key){ if(NULL == pCur) { pCur = new BSTNode(); pCur->m_Data = key; pCur->m_pLeft = NULL; pCur->m_pRight = NULL; } else if(key < pCur->m_Data) AddBSTNode(pCur->m_pLeft, key); else if(key > pCur->m_Data) AddBSTNode(pCur->m_pRight, key); else cout<<"Duplicate node is not allowed."<<endl;} // 中序遍历并打印二叉树结点void DisplayBST(BSTNode* &root){ if(NULL == root) return; if(NULL != root->m_pLeft) DisplayBST(root->m_pLeft); cout<<root->m_Data<<" "; if(NULL != root->m_pRight) DisplayBST(root->m_pRight);} void main(){ BSTNode* myRoot = NULL; AddBSTNode(myRoot, 8); AddBSTNode(myRoot, 6); AddBSTNode(myRoot, 10); AddBSTNode(myRoot, 5); AddBSTNode(myRoot, 7); AddBSTNode(myRoot, 9); AddBSTNode(myRoot, 11); cout<<"Original BST: "<<endl; DisplayBST(myRoot); cout<<endl<<"Solution 1 : recursion"<<endl; SeekBSTMirror(myRoot); DisplayBST(myRoot); cout<<endl<<"Solution 2: circulation"<<endl; SeekBSTMirror2(myRoot); DisplayBST(myRoot); cout<<endl; system("pause");}
- 面试100题:15.求二叉树的镜像
- 面试100题:15.求二叉树的镜像
- 程序员面试100题之十三:求二叉查找树的镜像
- 程序员面试100题之十三:求二叉查找树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像
- 求二叉树的镜像二叉树
- 二叉树的镜像 【微软面试100题 第十五题】
- 【从零单排之微软面试100题系列】15之二叉树的镜像
- [程序员面试题精选100题]11.求二叉查找树的镜像
- 常用的xpath
- 电商价格战——“永恒”的败笔
- mysql升级5.5.20时遇到的问题:1548-Cannot load from mysql.proc. The table is probably corrupted
- [DLL]创建和静态使用动态链接库dll
- MySQL之alter语句用法总结
- 面试100题:15.求二叉树的镜像
- 优化UITableView性能
- Linux 查看设备的常用命令
- html文件有保存的编码
- C#专题-C#的签名和重载,范围
- C#获取CPU序列号/网卡MAC地址/硬盘序列号
- C#专题-C#的名称空间[类型名称]
- 对alert方法 重写
- C#专题之C#的类型与变量