当前位置:首页 > 公众号精选 > 技术让梦想更伟大
[导读]关注、星标公众号,直达精彩内容文章来源:segmentfault作者:Ethson【导读】:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内容。请大家跟随小编一起来复习吧。本文针对面试中常...

文章来源:segmentfault


作者:Ethson



导读】:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内容。请大家跟随小编一起来复习吧。



本文针对面试中常见的二叉树操作做个总结:


  1. 前序遍历,中序遍历,后序遍历;
  2. 层次遍历;
  3. 求树的结点数;
  4. 求树的叶子数;
  5. 求树的深度;
  6. 求二叉树第k层的结点个数;
  7. 判断两棵二叉树是否结构相同;
  8. 求二叉树的镜像;
  9. 求两个结点的最低公共祖先结点;
  10. 求任意两结点距离;
  11. 找出二叉树中某个结点的所有祖先结点;
  12. 不使用递归和栈遍历二叉树;
  13. 二叉树前序中序推后序;
  14. 判断二叉树是不是完全二叉树;
  15. 判断是否是二叉查找树的后序遍历结果;
  16. 给定一个二叉查找树中的结点,找出在中序遍历下它的后继和前驱;
  17. 二分查找树转化为排序的循环双链表;
  18. 有序链表转化为平衡的二分查找树;
  19. 判断是否是二叉查找树。

1 前序遍历,中序遍历,后序遍历;

1.1 前序遍历

对于当前结点,先输出该结点,然后输出它的左孩子,最后输出它的右孩子。以上图为例,递归的过程如下:


  1. 输出 1,接着左孩子;
  2. 输出 2,接着左孩子;
  3. 输出 4,左孩子为空,再接着右孩子;
  4. 输出 6,左孩子为空,再接着右孩子;
  5. 输出 7,左右孩子都为空,此时 2 的左子树全部输出,2 的右子树为空,此时 1 的左子树全部输出,接着 1 的右子树;
  6. 输出 3,接着左孩子;
  7. 输出 5,左右孩子为空,此时 3 的左子树全部输出,3 的右子树为空,至此 1 的右子树全部输出,结束。
而非递归版本只是利用 stack 模拟上述过程而已,递归的过程也就是出入栈的过程。


/* 前序遍历递归版 */
void PreOrderRec(Node * node)
{
if (node == nullptr)
return;
cout << node->data << " ";   // 先输出当前结点
PreOrderRec(node->left);     // 然后输出左孩子
PreOrderRec(node->right);    // 最后输出右孩子
}

/* 前序遍历非递归版 */
void PreOrderNonRec(Node * node)
{
if (node == nullptr)
return;

stack S;
cout << node->data << " ";
S.push(node);
node = node->left;

while (!S.empty() || node)
{
while (node)
{
cout << node->data << " "; // 先输出当前结点
S.push(node);
node = node->left;         // 然后输出左孩子
}                              // while 结束意味着左孩子已经全部输出

node = S.top()->right;         // 最后输出右孩子
S.pop();
}
}

1.2 中序遍历

对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子。以(1.1)图为例:


  1. 1-->2-->4,4 的左孩子为空,输出 4,接着右孩子;
  2. 6 的左孩子为空,输出 6,接着右孩子;
  3. 7 的左孩子为空,输出 7,右孩子也为空,此时 2 的左子树全部输出,输出 2,2 的右孩子为空,此时 1 的左子树全部输出,输出 1,接着 1 的右孩子;
  4. 3-->5,5 左孩子为空,输出 5,右孩子也为空,此时 3 的左子树全部输出,而 3 的右孩子为空,至此 1 的右子树全部输出,结束。
/* 中序遍历递归版 */
void InOrderRec(Node * node)
{
if (node == nullptr)
return;

InOrderRec(node->left);     // 先输出左孩子
cout << node->data << " ";  // 然后输出当前结点
InOrderRec(node->right);    // 最后输出右孩子
}

/* 前序遍历非递归版 */
void InOrderNonRec(Node * node)
{
if (node == nullptr)
return;

stack S;
S.push(node);
node = node->left;

while (!S.empty() || node)
{
while (node)
{
S.push(node);
node = node->left;
}                             // while 结束意味着左孩子为空

cout << S.top()->data << " "; // 左孩子已经全部输出,接着输出当前结点
node = S.top()->right;        // 左孩子全部输出,当前结点也输出后,最后输出右孩子
S.pop();
}
}

1.3 后序遍历

对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点。依旧以(1.1)图为例:


  1. 1->2->4->6->7,7 无左孩子,也无右孩子,输出 7,此时 6 无左孩子,而 6 的右子树也全部输出,输出 6,此时 4 无左子树,而 4 的右子树已全部输出,接着输出 4,此时 2 的左子树全部输出,且 2 无右子树,输出 2,此时 1 的左子树全部输出,接着转向右子树;
  2. 3->5,5 无左孩子,也无右孩子,输出 5,此时 3 的左子树全部输出,且 3 无右孩子,输出 3,此时 1 的右子树全部输出,输出 1,结束。
非递归版本中,对于一个结点,如果我们要输出它,只有它既没有左孩子也没有右孩子或者它有孩子但是它的孩子已经被输出(由此设置 pre 变量)。若非上述两种情况,则将该结点的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,先依次遍历左子树和右子树。


/* 后序遍历递归版 */
void PostOrderRec(Node * node)
{
if (node == nullptr)
return;

PostOrderRec(node->left);   // 先输出左孩子
PostOrderRec(node->right);  // 然后输出右孩子
cout << node->data << " ";  // 最后输出当前结点
}

/* 后序遍历非递归版 */
void PostOrderNonRec(Node * node)
{
if (node == nullptr)
return;

Node * pre = nullptr;
stack S;
S.push(node);

while (!S.empty())
{
node = S.top();

if ((!node->left 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

上海2024年4月17日 /美通社/ -- 在2024 F1中国站即将拉开帷幕之际,高端全合成润滑油品牌美孚1号今日举办了品牌50周年庆祝活动。三届F1年度车手总冠军马克斯•维斯塔潘也亲临现场,共同庆祝这一里程...

关键字: BSP 汽车制造 行业标准 产品系列

北京2024年4月17日 /美通社/ -- 2024年4月13日,由北京康盟慈善基金会主办的"县域诊疗,规范同行"——肿瘤诊疗学术巡讲项目首站在广州隆重召开。本次会议邀请全国多位肺癌领域专家和县域同道...

关键字: AI技术 医疗服务 BSP 互联网

海口2024年4月16日 /美通社/ -- 4月14日,在中法建交60周年之际,科学护肤先锋品牌Galenic法国科兰黎受邀入驻第四届中国国际消费品博览会(以下简称"消博会")法国馆。Galenic法...

关键字: NI IC BSP ACTIVE

上海2024年4月17日 /美通社/ -- 每年4月17日是世界血友病日。今年,世界血友病日以"认识出血性疾病,积极预防和治疗"为主题,呼吁关注所有出血性疾病,提升科学认知,提高规范化诊疗水平,让每一位出血性疾病患者享有...

关键字: VII 动力学 软件 BSP

伦敦2024年4月16日 /美通社/ -- ATFX宣布任命Siju Daniel为首席商务官。Siju在金融服务行业拥有丰富的经验和专业知识,曾在全球各地的高管职位上工作了19年以上。Siju之前担任FXCM首席商务官...

关键字: NI AN SI BSP

常州2023年9月25日 /美通社/ -- 9月23日,由江苏省商务厅指导,世界中餐业联合会、常州市人民政府主办的"第三届中华节气菜大会暨首届江南美食节"在江苏常州开幕。文化和旅游部国际交流与合作局一...

关键字: BSP 可持续发展 大赛 质量控制

北京2023年9月25日 /美通社/ -- 9月21日,由中国质量报刊社·中国质量新闻网主办的第六届食品高质量发展交流会在北京举行,会议主题为"高质量,新生活",旨在推动食品行...

关键字: 自动化 BSP ISO9001 NAS

北京2023年9月23日 /美通社/ -- 近日,主线科技正式获准在北京市智能网联汽车政策先行区道路开启常态化测试与示范,将与物流客户在真实开放的城区道路场景中,率先开启基于L4级别自动驾驶能力的智能卡车运输示范。 随...

关键字: 智能卡 测试 高速公路 BSP

曼谷2023年9月18日 /美通社/ -- 作为东南亚的旅游胜地,泰国一直在全球范围内吸引着无数游客的目光。泰国旅游和体育部近日公布的报告显示,今年前7个月,泰国旅游业总收入约为1.08万亿泰铢(约合人民币2233亿元)...

关键字: BSP GEN 国美 AN
关闭