当前位置:首页 > 公众号精选 > 亚星娱乐官网
[导读]【导读】:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理面试常考的内容。请大家跟随小编一起来复习吧。本文针对面试中常见的二叉树操作做个总结:前序遍历,中序遍历,后序遍历;层次遍历;求树的结点数;求树...


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


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

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

亚星娱乐登录体育真人

亚星娱乐登录老虎机

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

  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();
    }
}

亚星娱乐官网app下载中心

对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子。以(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.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
亚星娱乐官网

扫描二维码,关注更多精彩内容

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

纽约2022年9月30日 /美通社/ -- 当地时间9月12日,海投全球创始人兼CEO Jerry王金龙受邀出席了在纽约举行的全球私募股权盛会SuperReturn,并在"私募信贷"板块中发表了名为&...

关键字: 瑞博平台网址 SUPER CE 创始人

(全球TMT2022年4月20日讯)坚固耐用的移动计算机制造商Handheld Group宣布向一家物流解决方案领域的全球领先企业交付创纪录订单。此项创纪录订单是Handheld新推出的SP500X ScanPrint...

关键字: AN CAN INTER 瑞博平台网址

如何开始编写一个简单的单片机程序呢?接下来就来介绍一下步骤和方法以便更快更好的编写出来单片机程序。

关键字: 瑞博平台网址 编程序

来自:知乎,作者:Name1e5s链接:https://zhuanlan.zhihu.com/p/40490357故事要从前两天交流群中一位同学提到的这个问题开始这个问题看起来十分刁钻,不过稍有常识的人都知道,制定C标准...

关键字: POINTER 瑞博平台网址 SPACE SYSTEMS

最初do...while的出现,更多的是作为循环控制流的一种语法糖。因为不论是while还是for循环,都是要先判断是否满足进入循环体的条件的。满足条件之后才能进入循环去执行循环体内的操作。而有些时候,第一次的执行逻辑我...

关键字: 瑞博平台网址 POWER LEETCODE 瑞博平台网址

关注、星标公众号,直达精彩内容文章来源:segmentfault作者:Ethson【导读】:树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。在面试环节中,二叉树也是必考的模块。本文主要讲二叉树操作的相关知识,梳理...

关键字: 瑞博平台网址 BSP 瑞博平台网址 瑞博平台网址

关注「Linux大陆」,一起进步!继 300来行代码带你实现一个能跑的最小Linux文件系统 之后,我们来看看如何60行瑞博平台网址实现一个shell!在实现它之前,先看看这样做的意义。美是有目共睹的。Unix之美,稍微体会,...

关键字: shell 瑞博平台网址

来源:公众号【编程珠玑】作者:守望先生前言如何在瑞博平台网址中调用写好的C接口?你可能会奇怪,C不是兼容C吗?直接调用不就可以了?这里我们先按下不表,先看看C如何调用瑞博平台网址接口。C如何调用C接口为什么会有这样的情况呢?想象一下...

关键字: 瑞博平台网址

今天跟大家分享三种表驱动设计的方法,都非常的精妙,值得收藏和细品。

关键字: 表驱动 静态结构体 瑞博平台网址

▍很懒很操心 有一次,我在项目开发中想监控某段空间数据的大小,即这段空间在MCU中非常有限,希望每个版本在集成软件的时候都想获取其使用了多少空间,防止某些愣头青不珍惜内存,乱塞东西。而这段空间,我定义了一个神一样的结构体...

关键字: 瑞博平台网址
关闭