递归和循环两种方法完成树的镜像转换
来源:互联网 发布:天龙八部全套源码资源 编辑:程序博客网 时间:2024/04/30 12:54
- /*
- copyright@nciaebupt 转载出处:http://blog.csdn.net/nciaebupt/article/details/8506038
- 题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换。
- 例如:
- 8 8
- / \ 转换 / \
- 6 10 --> 10 6
- / \ / \ / \ / \
- 5 7 9 11 11 9 7 5
- */
- #include <cstdlib>
- #include <iostream>
- #include <stack>
- struct BSTreeNode
- {
- int value;
- int flag;
- BSTreeNode * left;
- BSTreeNode * right;
- };
- //创建二叉查找树
- BSTreeNode * InsertBSTree(BSTreeNode * pRoot,int value)
- {
- //创建节点并初始化
- BSTreeNode * pNode = new BSTreeNode();
- pNode->value = value;
- pNode->flag = 0;
- pNode->left = NULL;
- pNode->right = NULL;
- BSTreeNode * pCur = pRoot;
- BSTreeNode * pParent = NULL;
- if(pRoot == NULL)
- {
- pRoot = pNode;
- }
- else
- {
- while(pCur != NULL)
- {
- pParent = pCur;
- if(value < pCur->value)
- pCur = pCur->left;
- else
- pCur = pCur->right;
- }
- if(value < pParent->value)
- pParent->left = pNode;
- else
- pParent->right = pNode;
- }
- return pRoot;
- }
- //中序遍历二叉树
- void InOrderBSTree1(BSTreeNode * pRoot)
- {
- BSTreeNode * pCur = pRoot;
- if(pCur != NULL)
- {
- InOrderBSTree1(pCur->left);
- std::cout<<pCur->value<<std::endl;
- InOrderBSTree1(pCur->right);
- }
- }
- void InOrderBSTree(BSTreeNode * pRoot)
- {
- BSTreeNode cur = *pRoot;
- std::stack<BSTreeNode> stack;
- stack.push(cur);
- while(!stack.empty())
- {
- if(stack.top().flag == 0)
- {
- stack.top().flag = 1;
- if(stack.top().left != NULL)
- {
- stack.push(*(stack.top().left));
- }
- }
- else
- {
- std::cout<<stack.top().value<<std::endl;
- BSTreeNode tmp = stack.top();
- stack.pop();
- if(tmp.right != NULL)
- {
- stack.push(*(tmp.right));
- }
- }
- }
- }
- //将二叉查找树转换为它的镜像,递归实现
- void BSTree2MirrorRcur(BSTreeNode * pRoot)
- {
- if(pRoot == NULL)
- {
- return;
- }
- //交换指针
- BSTreeNode * tmp = pRoot->left;
- pRoot->left = pRoot->right;
- pRoot->right = tmp;
- //递归左子树
- if(pRoot->left != NULL)
- {
- BSTree2MirrorRcur(pRoot->left);
- }
- //递归右子树
- if(pRoot->right != NULL)
- {
- BSTree2MirrorRcur(pRoot->right);
- }
- }
- //将二叉查找树转换为它的镜像,循环实现
- void BSTree2Mirror(BSTreeNode * pRoot)
- {
- if(pRoot == NULL)
- return;
- std::stack<BSTreeNode*> pStack;
- BSTreeNode * pCur = pRoot;
- BSTreeNode * pTmp = NULL;
- pStack.push(pCur);
- while(!pStack.empty())
- {
- pCur = pStack.top();
- pStack.pop();
- pTmp = pCur->left;
- pCur->left = pCur->right;
- pCur->right = pTmp;
- if(pCur->left != NULL)
- pStack.push(pCur->left);
- if(pCur->right != NULL)
- pStack.push(pCur->right);
- }
- }
- int main(int args,char **argv)
- {
- int array[] = {8,6,10,5,7,9,11};
- int len = sizeof(array)/sizeof(int);
- //创建二叉查找树
- BSTreeNode * pRoot = NULL;
- for(int i = 0;i < len;++i)
- {
- pRoot = InsertBSTree(pRoot,array[i]);
- }
- //中序遍历二叉树
- InOrderBSTree(pRoot);
- //将二叉查找树转换为它的镜像,递归实现
- //BSTree2MirrorRcur(pRoot);
- //中序遍历二叉树
- //InOrderBSTree(pRoot);
- //将二叉查找树转换为它的镜像,循环实现
- BSTree2Mirror(pRoot);
- //中序遍历二叉树
- InOrderBSTree(pRoot);
- system("pause");
- return 0;
- }
- 递归和循环两种方法完成树的镜像转换
- 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换。
- 面试题:输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换。
- 输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环两种方法完成树的镜像转换:
- 求二元查找树的镜像,循环和递归两种方式
- 反转一个链表的两种方法:递归和循环
- C语言循环和递归两种方法求n的阶乘
- 二分查找的两种实现方式--循环和递归
- 二叉树的镜像(递归和非递归)
- 两种方法实现单向链表的创建、遍历、删除、查找、逆序输出(循环法和递归法)
- 递归算法和循环算法的转换
- 算法 递归和循环的转换
- 将List转成树的两种方式(递归、循环)
- 将List转成树的两种方式(递归、循环)
- 用循环的方法实现二叉树的镜像
- docker 制作镜像的两种方法
- 二分查找 (循环、递归两种方法)
- 二分查找的循环和递归方法
- Java程序两个数据表之间导数据mysql
- (转)C++中extern “C”含义深层探索
- (pojstep1.1)1753(dfs+枚举)
- MFC 浏览文件夹,浏览保存文件, 获取当前路径
- ganglia3.5 安装
- 递归和循环两种方法完成树的镜像转换
- 通过Eclipse插件Bytecode Outline方便了解Java字节码
- 导入插件报“找不到模块”
- 应用程序接收不到BOOT_COMPLETED消息的原因总结
- Qt波形图
- java面试题
- linux 端口转发
- java调用存储过程……简写
- 如果网站有大量的图片,是存在数据库好?还是存文件?