面试题(二叉树相关)

【数据结构】二叉树详解 树是一种非线性的数据结构,是由多个节点组成的有层次关系的集合,看起来就像一颗倒挂的树,如下图:树中有一个节点没有前驱节点,这个节点称为根节点除根节点外,其余的节点又可以看成多个互不相交的集合,每一个集合就是一颗子树。 阅读详情
// 二叉树有关的操作

#include "stdafx.h"
#include "CommonDataStruct.h"
#include <stddef.h>
#include <stack>
#include <queue>

//////////////////////////////////////////////////////////////////////////
// 给定二叉搜索树,转换成双向链表
// lchild变成双链表的prev指针, rchild变成双链表的next指针.
BTNODE* BST2DLL(BTNODE* root)
{
    BTNODE* head = nullptr;

    if (root == nullptr)
    {
        return head;
    }

    BTNODE* p = nullptr; //p指向已经建好的部分双链表的最后一个元素
    BTNODE* q = root;
    std::stack<BTNODE*> stkTreeNode;
    while (q != nullptr || !stkTreeNode.empty())
    {
        if (q != nullptr) //压栈过程不建表
        {
            stkTreeNode.push(q);
            q = q->lchild;
        }
        else // 在pop过程中拼接双链表
        {
            q = stkTreeNode.top();
            stkTreeNode.pop();

            if (p != nullptr)
            {
                p->rchild = q; //p->next = p
            }
            q->lchild = p; //q->prev = p

            if (head == nullptr) // q is the head node.
            {
                head = q;
            }

            p = q;

            q = q->rchild;
        }
    }

    return head;
}

//////////////////////////////////////////////////////////////////////////
// 给定二叉树,求二叉树最大的宽度
struct QNODE
{
    QNODE(BTNODE* p, int l) {pTreeNode = p, nLevel = l;}
    BTNODE* pTreeNode;
    int nLevel;
};

unsigned int GetBTreeMaxWidth(BTNODE* root)
{
    if (root == nullptr)
    {
        return 0;
    }

    std::queue<QNODE*> q;
    QNODE* r = new QNODE(root, 0);
    q.push(r);
    unsigned int uMaxDepth = 1;
    while(!q.empty())
    {
        // dequeue all elements that on the same level, and enqueue their children.
        QNODE* pFront = q.front();
        int nCurLevel = pFront->nLevel;
        while (!q.empty() && (pFront = q.front())->nLevel == nCurLevel)
        {
            q.pop();
            if (pFront->pTreeNode->lchild != nullptr)
            {
                QNODE* lch = new QNODE(pFront->pTreeNode->lchild, pFront->nLevel + 1);
                q.push(lch);
            }
            if (pFront->pTreeNode->rchild != nullptr)
            {
                QNODE* rch = new QNODE(pFront->pTreeNode->rchild, pFront->nLevel + 1);
                q.push(rch);
            }

            delete pFront;
        }

        // After the while loop is finished, the queue only contains next level elements.
        // So let's check the length of the queue.
        if(uMaxDepth < q.size())
        {
            uMaxDepth = q.size();
        }
    }

    return uMaxDepth;
}

//////////////////////////////////////////////////////////////////////////
// 已知二叉树的前序和中序,递归构造二叉树
// ps, pe是preorder前序数组的起始元素下标和结束元素下标
// is, ie是inorder中序数组的起始元素下标和结束元素下标
BTNODE* BuildBinaryTree(int preorder[], int ps, int pe, int inorder[], int is, int ie)
{
    if (ps > pe || is > ie)
    {
        return nullptr;
    }

    int nPreOrderLen = pe - ps + 1;
    int nInOrderLen = ie - is + 1;
    if (nPreOrderLen != nInOrderLen)
    {
        return nullptr;
    }

    BTNODE* root = new BTNODE();
    root->val = preorder[ps];
    if (nPreOrderLen == 1)
    {
        root->lchild = nullptr;
        root->rchild = nullptr;
    }
    else
    {
        // Search the root in inorder
        int r;
        for (r = is; r <= ie; ++r)
        {
            if(inorder[r] == preorder[ps])
            {
                break;
            }
        }

        // if we cannot find root element in inorder, something wrong.
        if (r == ie && inorder[r] != preorder[ps])
        {
            delete root;
            return nullptr;
        }

        if (r - is > 0) // have left subtree.
        {
            root->lchild = BuildBinaryTree(preorder, ps+1, ps+(r-is), inorder, is, r-1);
        }

        if (ie - r > 0) // have right subtree
        {
            root->rchild = BuildBinaryTree(preorder, ps+(r-is)+1, pe, inorder, r+1, ie);
        }
    }

    return root;
}

//////////////////////////////////////////////////////////////////////////
// 递归后序遍历二叉树
void PostOrder(BTNODE* root)
{
    if (root != nullptr)
    {
        PostOrder(root->lchild);
        PostOrder(root->rchild);
        printf("%d ", root->val);
    }
}

// 递归前序遍历二叉树
void PreOrder(BTNODE* root)
{
    if(root != nullptr) 
    {
        printf("%d ", root->val);
        PreOrder(root->lchild);
        PreOrder(root->rchild);
    }
}

// 非递归中序遍历二叉树
void NonRescursionInOrder(BTNODE* root)
{
    if (root == nullptr)
    {
        return;
    }

    std::stack<BTNODE*> stkTreeNode;
    BTNODE* p = root;

    while (p != nullptr || !stkTreeNode.empty())
    {
        if (p != nullptr)
        {
            stkTreeNode.push(p);
            p = p->lchild;
        }
        else
        {
            p = stkTreeNode.top();
            stkTreeNode.pop();
            printf("%d ", p->val);
            p = p->rchild;
        }
    }
}

// 非递归逆中序遍历二叉树
void NonRescursionReverseInOrder(BTNODE* root)
{
    if (root == nullptr)
    {
        return;
    }

    std::stack<BTNODE*> stkNode;
    BTNODE* p = root;

    while (p != nullptr || !stkNode.empty())
    {
        if (p != nullptr)
        {
            stkNode.push(p);
            p = p->rchild;
        }
        else
        {
            p = stkNode.top();
            stkNode.pop();
            printf("%d ", p->val);
            p = p->lchild;
        }
    }
}

//////////////////////////////////////////////////////////////////////////
// 给定二叉搜索树,查找第K大个数,注意是大,所以是逆中序访问,修改非递归中序的访问左右子树的顺序即可.
void FindKthMax(BTNODE* root, int k)
{
    if (root == nullptr)
    {
        return;
    }

    std::stack<BTNODE*> stkNode;
    BTNODE* p = root;
    int nVisited = 0;

    while (p != nullptr || !stkNode.empty())
    {
        if (p != nullptr)
        {
            stkNode.push(p);
            p = p->rchild;
        }
        else
        {
            p = stkNode.top();
            stkNode.pop();
            if (++nVisited == k)
            {
                printf("We've got it, %dth maximum number is %d", k, p->val);
                break;
            }
            p = p->lchild;
        }
    }

    if (nVisited < k)
    {
        printf("Sorry, K overflowed.");
    }
}

//////////////////////////////////////////////////////////////////////////
// Test

#define countof(a) sizeof(a)/sizeof(a[0])

void TreeTest()
{
    int preorder[] = {11, 8, 3, 1, 4, 9, 17, 13, 12, 14, 19};
    int inorder[] = {1, 3, 4, 8, 9, 11, 12, 13, 14, 17, 19};

    BTNODE* root = BuildBinaryTree(preorder, 0, countof(preorder)-1, inorder, 0, countof(inorder)-1);

    printf("Pre order: ");
    PreOrder(root);
    printf("\r\n");

    printf("Post order : ");
    PostOrder(root);
    printf("\r\n");

    printf("In order : ");
    NonRescursionInOrder(root);
    printf("\r\n");

    printf("Reverse in order : ");
    NonRescursionReverseInOrder(root);
    printf("\r\n");

    FindKthMax(root, 5);
    printf("\r\n");

    printf("tree max width is %d\r\n", GetBTreeMaxWidth(root));

    BTNODE* head = BST2DLL(root);
    //正反向验证双链表
    BTNODE* a = head;
    while (a != nullptr)
    {
        printf("%d ", a->val);
        a = a->rchild;
    }
    printf("\r\n");
    a = head;
    while (a->rchild != NULL)
    {
        a = a->rchild;
    }
    while (a != nullptr)
    {
        printf("%d ", a->val);
        a = a->lchild;
    }
    printf("\r\n");
}


 

二叉树基础知识总结 题外话昨晚面了腾讯,问了一个完全二叉树的题,竟然让我算了快10分钟,因为等比公式记错了导致最后用最原始的方法推算结果也没算对,一下子就懵了。本来精心准备了1周的面试,最后因为自己基础知识记忆不牢固导致了悲剧。不管怎样,还是要继续查漏补缺,准备将数据结构再细细看一遍,先来补上二叉树的这个漏洞吧。 一、树的定义树是一种数据结构,它是由n(n&gt;=1)个有限结点组成一个具有层次关系的集合。 树具有的... 阅读详情

相关推荐

PaddleOCR实战:给图片‘加个框’,轻松搞定小图和长图文字识别不准的难题

本文探讨了PaddleOCR在处理小图和长图时识别精度下降的问题,并提出通过图像边框预处理技术显著提升OCR识别效果。详细介绍了使用OpenCV实现智能边框添加的方法,包括核心原理、工程实践中的关键细节以及性能优化策略,帮助开发者轻松解决非常规尺寸图像的文本检测难题。

weixin_29313547的博客 188

深入理解二叉树(超详细)

二叉树(Binary Tree) 回顾 在前面的文章 — 二叉树前奏中,我们对于二叉树的一些基本概念进行了回顾,同时对比了线性结构与树形结构,总结了一些常见的二叉树的性质,像二叉树,真二叉树,完全二叉树,以及满二叉树等等,但是,我们仅仅是在概念上对于二叉树有所了解,并没有进行编码工作,今天来完善一下这一步的操作 直接进入二叉树的设计与编码,如果你对于二叉树的概念以及性质不了解的话,可以回去翻翻 二叉树前奏,熟悉一下,因为编码实际上就是对于二叉树性质的一个体现 设计 属性与节点 首先,我们的二叉树是用来存放元

Kalton的博客 2万+

智能车竞赛走马观碑组:赛道元素与目标板识别策略解析

本文深入解析了智能车竞赛走马观碑组别的核心挑战与策略。重点探讨了如何应对PVC赛道的光照、磨损及无边界线等复杂环境,并详细阐述了基于红色引导区的目标板高效识别流程。通过平衡轻量化模型选择、实时决策与精准控制,实现赛道元素适应性与目标板识别策略的优化,为参赛者提供了一套完整的系统集成与实战调参思路。

x8y9z0的博客 461

【数据结构】——二叉树详解

二叉树(Binary Tree)是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树TTT有且仅有一个根结点;除根结点外的其余结点又可分为两个不相交的子集TLT_LTL​和TRT_RTR​,分别称为TTT的左子树和右子树,且TLT_LTL​和TRT_RTR​本身又都是二叉树。很明显该定义属于递归定义,所以有关二叉树的操作使用递归往往更容易理解和实现。从定义也可以看出二叉树与一般树的区别主要是两点,一是每个结点的度最多为2;

atwdy的博客 6万+

COCOS 3.8 接入高德定位SDK

/微信登录所必须的code。//是否获得code。

八喜互动 1995

嵌入式设备系统日志记录及调试技巧_嵌入式日志系统(1),如何成为杰出的程序员

这里面我使用的芯片为哈弗体系,全局常量存储编译器默认分配在flash,需要注意如果使用片内flash时,注意存储调试等级的flash块不要与代码区重合,要不然修改调试等级擦除flash块同时PC指针指向当前块的代码区,会导致仪器死机;这个也是之前用的比较多的,以上代码是模仿linux 内核的写法,可以比较好的做到日志信息分层,编译时相加对应的编译开关即可。但有个弊端就是,切换debug等级时,需要重新编译且需更新固件,而嵌入式设备出现异常后更新固件往往复位后,故障有时很难复现,调试起来比较浪费时间。

2401_84240431的博客 1295

二叉树(详解)

简单实现二叉树

weixin_63246738的博客 1万+

网络摄像头(IPC)介绍:类型、供电、镜头、夜视等

IPC(Internet Protocol Camera,网络摄像头),它是一种由传统摄像机与网络技术结合所产生的新一代摄像机。它可以将视频、音频、报警及控制信号通过网络传输,接受网络监控主机(NVR或监控管理平台)的管理。IPC可与路由器、交换机、NVR等设备组建成为监控系统。

学无止境,Fighting! 1万+

二叉树相关面试题

/****************************************************************************************** Copyright (c) Inc.(2013), All rights reserved. Purpose: 实现二叉树的基本面试题 Author: MaJing Reviser: yyy Crea

MJ813的专栏 562

大疆智图002:大疆智图倾斜摄影建模流程

本文主要介绍大疆智图倾斜摄影建模流程,包括新建工程、成果路径设置、导入照片、第一遍空三、像控刺点、第二遍空三、精度报告查看、三维重建等流程。

qq_31762031的博客 1万+

YOLO26优化:注意力魔改 | 用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测,暴力涨点

用于微小目标检测的上下文增强和特征细化网络ContextAggregation,助力小目标检测

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 491

二叉树相关面试题【数据结构】

题目基础面试题二叉树的前序遍历二叉树的中序遍历进阶面试题 基础面试题 二叉树的前序遍历 题目:在线OJ 思考: 首先,我们要了解,前序遍历就是按照顺序:根节点—左子树—右子树的方式遍历树(根左右) 在访问左右子树的时候,按照上述同样的方法遍历,因此我们可以考虑使用模拟递归来解决 创建一个 List,将根节点的元素加入到 List 中 递归遍历左子树,把左子树的遍历结果加入到 List 中 递归遍历右子树,把右子树的遍历结果加入到 List 中 最后返回这个 List 即可 代码实现: public L

一朵花花 1618

61、神经科学中的分岔与双分子反应研究

本文探讨了神经科学中的分岔现象与双分子反应建模。在神经元网络中,通过分析四细胞网络的呼吸节律振荡,揭示了分岔对振荡频率和占空比的影响,并区分了单神经元与网络层面的分岔特性。在神经群体模型中,系统参数变化引发的分岔可导致振荡、混沌等动态行为转变,文中详细介绍了局部分岔、全局分岔和高余维分岔的机制,并以Jansen-Rit模型为例展示了输入水平变化下的分岔过程。在分子层面,重点介绍了MWC模型在描述配体与多位点蛋白质结合中的应用,涵盖其构象状态、平衡常数及统计因子。研究表明,分岔理论和双分子反应建模为理解神经系

yog99的博客 80

一些二叉树相关面试题

用树形dp套路解决一些二叉树问题!

学代码的咸鱼的博客 611

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

二叉树及相关面试题

树的概念:树是一种非线性的数据结构,它有n个有限节点组成一个具有层次关系的集合。 树的相关概念: 节点的度:一个节点含有子树的个数称为该节点的度;如上图:A的度为6. 树的度:一棵树中,所有节点的度最大值称为树的度;如上图:树的度为6. 叶子结点或终端节点:度为0的节点称为叶子结点;如上图:B、C、H、I、P... 如果一个节点有子节点,则这个节点称为这个子节点的父节点或双亲节点 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:B是A的孩子节点 根节点:一棵树中,没

yahid的博客 681

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

二叉树相关面试题集锦

前言      在面试过程中,关于二叉树的面试题绝对不在少数,这一块也是各个公司喜欢出的考题。本文总结了一些经典的关于二叉树的面试题,本文会持续更新。在本文中涉及的二叉树节点没有特别声明的情况则默认为: typedef struct BTNode { int _value; BTNode* _left; BTNode* _right; }BTNode* pBTNode; 正文 题

不会?学啊! 1357

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

二叉树相关面试题总结

前言: 一、为什么要树结构? 不像数组、链表是线性的数据结构,树是一种分层的非线性数据结构 (1)使用树的一个原因是:我们需要存储有分层关系的信息(比如说文件系统) (2)另外一个是(BST):当把树建成有一定的形式的树可以方便数据的查找(对于平衡的树,查找时间复杂度为O(logn))。 (3)同理对于这样一个树(AVL/红黑树):他们的插入和删除的时间复杂度是(O(logn)) (4)相对于数组来

ChaseRaod的博客 453

二叉树相关编程面试题

相关题目 写博客记录不同做法,毕竟面试是提要求的不是直接ac就可以的。 如果是面试,先问问面试官结构是哪一种。 236. 二叉树的最近公共祖先 带有parent的三叉链结构->转换成了链表相交 如果要求空间复杂度为O(1)的话,就要模仿链表相交找到两个节点的高度差,然后两者到同一高度都往上走。 搜索二叉树结构 可以发现这样的性质:如果子节点的值一个比根大一个比根小,那么当前根就是最近公共祖先,不然就可以往左走或者往右走,从而变成递归解决子问题。 普通二叉树 思路一:仿照搜索二叉树的情况

代码笔记本 397

【面试题】二叉树相关

1.二叉树 二叉树是每个节点最多有两个子树的树结构 满二叉树:除叶子节点外,所有节点的度都为2 完全二叉树:叶子结点只能出现在最下两层;最下层的叶子一定集中在左部连续位置;倒数二层,若有叶子结点,一定都在右部连续位置;如果结点度为1 ,则该结点只有左孩子,即不存在只有右子树的情况;同样结点数的二叉树,完全二叉树的深度最小。 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树 2.前中序遍历的代

白夜行 648

[Java]快速入门二叉树,手撕相关面试题

本文主要讲解二叉树重点知识很少涉及无关的背景知识,旨在即快速又清晰熟练掌握二叉树并手撕相关面试题,希望我的文章能对你有所帮助与启发.

Node_Hao的博客 1413

【面试题】二叉树相关面试题

判断二叉树是否是平衡二叉树 可以分两步实现。第一步先遍历二叉树中的每一个结点node,调用height()求出该结点的左子树高度height(node.left) 和 右子树高度 height(node.right)。根据左右子树的高度差是否满足其绝对值不超过1,第二步看左子树和右子树是否平衡(子问题),判断该树是否为平衡二叉树。 int IsBalanceTree(BTreeNode *...

mmwwxx123的博客 303

二叉树相关面试题汇总

说明:本博文在以前面试题的基础上汇总了二叉树的常见面试题。二叉树中封装的功能有: void _CreateTree(Node*& pRoot, const T array[], size_t size, size_t& index, const T& invalid);//创建树 Node* _CopyBinaryTree(Node* pRoot);//拷贝树 void _Dest

观赏的博客 658
上一篇: 用官方刷机包给三星I780刷机的几个注意点
下一篇: 编程竞赛常见的问题类型(Programming Contest Problem Types )
会思考的草
博客等级 码龄25年 208粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值