首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 定义二元查找树的结点为: struct BSTreeNode // a node in the bi
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 定义二元查找树的结点为: struct BSTreeNode // a node in the bi
admin
2019-03-29
70
问题
输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
定义二元查找树的结点为:
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
};
选项
答案
/////////////////////////////////////////////////////////////////////// // Mirror a BST (swap the left right child of each node) recursively // the head of BST in initial call /////////////////////////////////////////////////////////////////////// void MirrorRecursively(BSTreeNode *pNode) { if(!pNode) return; // swap the right and left child sub-tree BSTreeNode *pTemp = pNode->m_pLeft; pNode->m_pLeft = pNode->m_pRight; pNode->m_pRight = pTemp; // mirror left child sub-tree if not null if(pNode->m_pLeft) MirrorRecursively(pNode->m_pLeft); // mirror right child sub-tree if not null if(pNode->m_pRight) MirrorRecursively(pNode->m_pRight); } 由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。参考代码如下: /////////////////////////////////////////////////////////////////////// // Mirror a BST (swap the left right child of each node) Iteratively // Input: pTreeHead: the head of BST /////////////////////////////////////////////////////////////////////// void MirrorIteratively(BSTreeNode *pTreeHead) { if(!pTreeHead) return; std::stack
stackTreeNode; stackTreeNode.push(pTreeHead); while(stackTreeNode.size()) { BSTreeNode *pNode = stackTreeNode.top(); stackTreeNode.pop(); // swap the right and left child sub-tree BSTreeNode *pTemp = pNode->m_pLeft; pNode->m_pLeft = pNode->m_pRight; pNode->m_pRight = pTemp; // push left child sub-tree into stack if not null if(pNode->m_pLeft) stackTreeNode.push(pNode->m_pLeft); // push right child sub-tree into stack if not null if(pNode->m_pRight) stackTreeNode.push(pNode->m_pRight); } }
解析
尽管我们可能一下子不能理解镜像是什么意思,但上面的例子给我们的直观感觉,就是交换结点的左右子树。我们试着在遍历例子中的二元查找树的同时来交换每个结点的左右子树。遍历时首先访问头结点8,我们交换它的左右子树得到:
我们发现两个结点6和10的左右子树仍然是左结点的值小于右结点的值,我们再试着交换他们的左右子树,得到:
刚好就是要求的输出。
上面的分析印证了我们的直觉:在遍历二元查找树时每访问到一个结点,交换它的左右子树。这种思路用递归不难实现,将遍历二元查找树的代码稍作修改就可以了。
转载请注明原文地址:https://kaotiyun.com/show/iRmZ777K
0
程序员面试
相关试题推荐
______,amanwhoexpresseshimselfeffectivelyissuretosucceedmorerapidlythanamanwhosecommandoflanguageispoor.
[A]Theperson-skillsmatchapproachtoselection[B]Theimpactsofbadselectiondecisions[C]Theimportanceofstructu
Directions:Inthissection,youareaskedtowriteanessaybasedonthefollowinginformation.Makecommentsandexpressy
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)
使用.NETPassport向导注册MSN帐户,姓名为李明,邮件的地址为liming@hotmail.com,密码为123456lm。
在PPoint中,超级链接只有在()中起作用。A.幻灯片视图B.幻灯片放映C.幻灯片浏览视图D.大纲视图
一个软件的架构设计是随着技术的不断进步而不断变化的。以编译器为例,其主流架构经历了管道—过滤器到数据共享为中心的转变过程。以下关于编译器架构的叙述中,错误的是______。
随机试题
Thesedaysmostpeople,especiallyyounggirls,liketolookslim.Ourgrandfather’s【21】weredifferent【22】ours,butnowadays【23】
给动物注射下列哪一种物质时,可先有一个短暂降压过程,然后出现升压反应
患者,女性,42岁。双侧颈部肿块1个月,近几日感觉吞咽困难。查体:T3及T4略低于正常值,甲状腺扫描表现为冷结节样,血清抗TG及抗微粒体抗体(ATMA)阳性;双侧甲状腺结节样肿大,质硬韧,与周围组织无明显粘连。手术切除部分组织做病理。镜下组织内有大量淋巴细
下列关于咽后间隙描述,错误的是
会计法律关系是指会计机构和会计人员在办理会计事务过程中以及国家在管理会计工作过程中发生的各种经济关系。()
茶叶按粗加工可分为绿茶、红茶、青茶、黑茶、黄茶、紧压茶六大类毛茶。()
某居民小区位于本市郊区外环线边缘,小区内有住户1840户,长住居民5300多人,基本上是由二十世纪五六十年代支边支农回城的人员、动迁人员和外地人住人员组成。小区人员有三大特点:一是无业和生活困难的居民多;二是六十岁以上的老人多;三是外来人员多。小区接到上级
欧盟《传统植物药注册程序指令》大限将至,中药出口欧洲遭遇严冬,人们不禁对中药_________产生了不小的怀疑。这其中确有中药自身种植、生产加工不统一的原因,致使药效和安全性能受到国际市场_________,但究其深层原因,则与国际中药市场暗藏的利益争夺不
设在SQLServer2008某数据库中有购买表(顾客号,商品号,购买时间),现要查询C01顾客购买过但C02顾客没有购买过的商品。请补全下列语句。SELECT商品号FROM购买表WHERE顾客号=′C01′____________
Whichgame...issoldwell?【P1】______allowsgainerstoselectgameswithequal-caliberopponents?【P2】______isprobablyfrigh
最新回复
(
0
)