算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-

news2024/11/24 22:36:42

目录

1.二叉树

2.搜索二叉树:

3.满二叉树:

4.平衡二叉树


1.二叉树


   先、中、后序遍历
   先序(中、左、右):1,2,4,5,3,6,7
   中序(左、中、右):4,2,5,1,6,3,7
   后序(左、右、中):4,5,2,6,7,3,1

 

void f(Node head)
{
   if(head==null)
      {return;}
   f(head.left);
   f(head.right);

}
//先序遍历(中、左、右)
void preOrderRecur(Node head)
{
    if(head==null){
       return;
 }
      cout<<head.value<<endl;
      preOrderRecur(head.left);
      preOrderRecur(head.right);
}
//中序遍历(左、中、右)
void InOrderRecur(Node head)
{
    if(head==null){
       return;
 }     
      InOrderRecur(head.left);
      cout<<head.value<<endl;
      InOrderRecur(head.right);
}
//后序遍历(左、右、中)
void PosOrderRecur(Node head)
{
    if(head==null){
       return;
 }
     
      PosOrderRecur(head.left);
      PosOrderRecur(head.right);
      cout<<head.value<<endl;
}

1,2,4,4,4,2,5,5,5,2,1,3,6,6,6,3,7,7,7,3,1
先序:打印第一次遇到
中序:打印第二次遇到
后序:打印第三次遇到

void inorderunrecur(node head)
{
    if(head!=null)
    stack<node> stack= new stack<node>():
    node cur=head;
    while(!stack.isEmpty()||cur!=null)
    {
      if(cur!=null)
      {
           stack.push(cur); //1.进栈
           cur=cur.left; 
     }
    else
    {
       cur= stack.pop();//2.栈中弹出
       cur= cur.right;  //3.右子树弹出
    }
}

打印二叉树
二叉树的宽度优先遍历 

void process(Node head)
{
    if(head==null)
    {
      return;
    }
     Queue<Node> queue= new LinkedList<>();//创建双向链表
     queue.add(head);
     while(!queue.isEmpty())   //如果队列不为空
     {
       Node cur=queue.poll();   //弹出就打印
       count<<cur.value<<endl;
       if(cur.left!=null)       //有左孩子
       {
          queue.add(cur.left);
       }
       if(cur.right!=null)      //有右孩子
       {
          queue.add(cur.right);
       }
     }

}

void main()
{
 
   process(head);
}

怎么求一个二叉树的最大宽度

//1.构造树

          1
   2            3
4    5        6   7
       8    9       10

void main(String[] args) {
		Node head = new Node(1);
		head.left = new Node(2);
        head.right = new Node(3);
		head.left.left = new Node(4);
        head.left.right = new Node(5);
        head.right.left = new Node(6);
        head.right.right = new Node(7);
		head.left.right.right = new Node(8);
        head.right.left.left = new Node(9);
        head.right.riht.right = new Node(10);

	    process(head);
	}


   添加节点的层数:

void process(Node head)
{
    if(head==null)
    {
      return;
    }
     

     HashMap<Node,Int> levelMap = new HashMap<>; //层数表   


     Queue<Node> queue= new LinkedList<>();     //创建双向链表

     levelMap.put(head,1);
     queue.add(head);

     int clevel=1; //当前层数
     int cnodes=0; //每层的个数
     int max=0;    //最大值


     while(!queue.isEmpty())    
     {
       Node cur=queue.poll();          //弹出就打印
       
       int level=levelMap.get(cur)
       if(level==clevel)
       {
             cnodes++;
       }
       else
       {
          if(cnodes>max)
          {
              max=cnodes;
          }
          clevel++;
          cnodes=1;
      }
    

       count<<cur.value<<level<<endl;
       if(cur.left!=null)              //有左孩子
       {
          levelMap.put(cur.left,level+1);
          queue.add(cur.left);
       }
       if(cur.right!=null)             //有右孩子
       {
          levelMap.put(cur.right,level+1);
          queue.add(cur.right);
       }
     }
    cout<<clevel<<cnodes<<endl;
    max= Math.max(max,cnodes);
    return max;

}

二叉树的递归套路(经典)



2.搜索二叉树:



左树节点小,右树都大。 中序遍历:左中右,依次递增,那么就是搜索二叉树。

满足条件:
1.左子树整体是搜索二叉树。
2.右子树整体是搜索二叉树。
3.左树上的最大值小于head。
4.右树上的最小值大于head。

class Node
{
   public:
     int value;
     Node left;
     Node right;
    Node(int data)
   { 
     int value=data;
   }
}
//左小,右大
class Info{
   public:
   bool isBST;//是否是搜索二叉树
   int min;  //最小值
   int max;  //最大值
}

以x为head 返回3个信息

Info process(Node x)
{
   if(x==null)
{
}

//1.遍历左右两颗树
Info  leftData= process(x.left);
Info  rightData=process(y.left);

//2.更新左树和右树的最大最小值
int min=x.value;
int max=x.value;
if(leftData!=null){
    min=Math.min(min,leftData.min);
    max=Math.max(max,leftData.max);
}
if(rightData!=null){
    min=Math.min(min,rightData.min);
    max=Math.max(max,rightData.max);
  }


//3.左右两边是否是搜索二叉树呢
bool isBST =false;
//左树是搜索二叉树 左树最大值小于我
//右树是搜索二叉树 右树最小值大于我
if((leftData!=null ?(leftData.isBST && leftData.max<x.value):true)
   &&(rightData!=null ?(rightData.isBST && rightData.min>x.value):true))
{
   isBST =true;
}
}


bool isBSTTest(Node x)
{
  Info info=process(head);
  return info.isBST;
}


3.满二叉树:


判断条件:n=2^h-1
 

class Node
{
   public:
     int value;
     Node left;
     Node right;
    Node(int data)
    { 
      int value=data;
    }
};
//个数和高度
class Info{
   public:
   int nodes;   //个数
   int height;  //高度
   Info(int n,int h)
   {
       nodes=n;
       height=h;
   }

};

以x为head 返回3个信息
Info process(Node x)
{
   if(x==null)
   {
     return new Info(0,0);
   }
   //遍历左右两颗树
    Info  leftData= process(x.left);
    Info  rightData=process(y.left);
    int nodes;
    int height;
    int nodes=leftInfo.nodes+rightInfo.nodes+1;
    int height=Math.max(leftInfo.height,rightInfo.height)+1;
    return new Info(nodes,height);
};


bool isFull(Node head)
{
  Info info=process(head);
  int N =info.nodes;
  int h=info.height;
 //N=2^H-1
 return  N==(1<<H)-1;
}

4.平衡二叉树



左树跟右树的高度差不超过1

class Node
{
   public:
     int value;
     Node left;
     Node right;
    Node(int data)
    { 
      int value=data;
    }
};
//个数和高度
class Info{
   public:
   bool isBalanced;
   int height;  
   Info(bool is,int h)
   {
       isBalanced=is
       height=h;
   }

};

以x为head 返回3个信息
Info process(Node x)
{
   if(x==null)//空树
   {x
     return new Info(true,0);
   }
   //遍历左右两颗树
    Info  leftInfo= process(x.left);
    Info  rightInfo=process(x.right);
    bool isBalanced;
    int height;
    height=Math.max(leftInfo.height,rightInfo.height)+1;     

    //左树平
    //右树平
    //高度差值绝对值<2
    bool isBalanced=leftInfo.isBalanced && rightInfo.isBalanced &&
                    Math.abs(leftInfo.height-rightInfo.height)<2;
    return new Info(isBalanced,height);
};


bool isBalanced(Node head)
{
  Info info=process(head);
  return info.isBalanced;
}







 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两个好用到爆的Python模块,建议收藏~

在日常开发工作中&#xff0c;经常会遇到这样的一个问题&#xff1a;要对数据中的某个字段进行匹配&#xff0c;但这个字段有可能会有微小的差异。比如同样是招聘岗位的数据&#xff0c;里面省份一栏有的写“广西”&#xff0c;有的写“广西壮族自治区”&#xff0c;甚至还有写…

Axure教程——直方图(中继器)

本文将教大家如何用AXURE用中继器制作直方图 一、效果介绍 如图&#xff1a; 预览地址&#xff1a;https://yjkepz.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87842701 二、制作方法 &#xff08;1&#xff09;制作刻度表 设计5个刻…

golang链接mysql

复习一下 对象 package mainimport("fmt" )type User struct{uid intname string }func main(){var user Userfmt.Println(user) }协程 package mainimport("fmt" )func test(){fmt.Println("test func") }func main(){go test()fmt.Println(…

Socket安全(一)

文章目录 1. 安全Socket2. 保护通信3. 创建安全客户端Socket4. 选择密码组5. 事件处理器6. 会话管理 1. 安全Socket 前面介绍了Socket的基本使用&#xff0c;这里开始介绍Socket的安全问题&#xff0c;作为一个Internet用户&#xff0c;你确实有一些保护手段可以保护自己的隐私…

KUC755AE105 3BHB005243R0105 串行连接的自动配置

KUC755AE105 埃德蒙顿(pr web)-2007年5月23日-MatrikonOPC宣布为Allen-Bradley PLC发布MatrikonOPC服务器。该OPC服务器为所有Allen-3BHB005243R0105 分布式控制系统(DCS)提供了可靠的连接&#xff0c;代表了连接Allen-Bradley设备的真正的“一体化”解决方案。Allen-Bradley…

自动化测试中的失败截图和存log

如果我们在执行自动化测试的时候&#xff0c;希望能在失败的时候保存现场&#xff0c;方便事后分析。 对于UI自动化&#xff0c;我们希望截图在测试报告中。 对于api自动化&#xff0c;我们希望截取出错的log在测试报告中。 我开始自己蛮干&#xff0c;写了两个出错截图的方法。…

linux init系统和系统管理器-Systemd学习

一、Systemd 概述 1.1、init 程序介绍及其发展历程 Linux init程序是系统启动时第一个启动的进程&#xff0c;它负责初始化系统资源&#xff0c;加载操作系统核心模块&#xff0c;启动系统服务和用户进程。init程序是系统启动的重要组成部分&#xff0c;它为后续的系统操作提…

2023年上半年信息系统项目管理师上午真题及答案解析

1.“新型基础设施”主要包括信息技术设施、融合基础设施和创新基础设施三个方面。其中信息基础设施包括&#xff08; &#xff09;。 ①通信基础设施 ②智能交通基础设施 ③新技术基础设施 ④科教基础设施 ⑤算力基础设施 A.①③⑤ B.①④⑤ C.②③④ D.②…

【JavaSE】Java基础语法(三十六):File IO流

文章目录 1. File1.1 File类概述和构造方法1.2 绝对路径和相对路径1.3 File 类的常用方法1.4 递归删除文件夹及其下面的文件 2. IO2.1 分类2.2 字节输出流2.3 字节输入流2.4 文件的拷贝2.5 文件拷贝效率优化2.6 释放资源2.7 缓冲流2.8 编码表 3. commons-io 工具包3.1 API 1. F…

如何在竞争激烈的市场环境下打造技术铁粉:CSDN的案例分析

如何在竞争激烈的市场环境下打造技术铁粉&#xff1a;CSDN的案例分析 随着互联网的快速发展&#xff0c;技术平台不仅成为了人们获取信息、学习知识和交流经验的重要渠道&#xff0c;也成为了各大企业和个人展示自我、争夺市场份额的关键竞技场。在这个过程中&#xff0c;CSDN…

ts reference 报错 ReferenceError: AA is not defined解决方案

我先说重点&#xff01;你看懂了就不用往下看了 ///<reference path"2.ts" /> 像上面这种代码是要编译后才有效果的&#xff0c;所以有些小伙伴发现教程demo也跑不了&#xff0c;跟命名空间啥的没关系&#xff01; 正文 你如果也报我我下面这种错误&#xff…

【智慧交通项目实战】《 OCR车牌检测与识别》(一)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

西南财经大学李玉周:数智化技术广泛使用推动管理会计加快落地

近日&#xff0c;由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会收官站圆满举办。来自知名院校的专家学者、央国企等大型企业财务领路人相约成都&#xff0c;一同见证“智能会计”新时代的到来&#xff0c;并肩探讨“价值财务”新主张。 为更好传递智能会计对企…

UnityVR--插件1--新版InputSystem

目录 新版的InputSystem 安装新版InputSystem插件 配置新的InputSystem 在项目中配置新版输入方式实现移动和开火 添加并绑定移动事件 添加并绑定开火事件 总结&#xff08;啰嗦几句&#xff09; 新版的InputSystem 在最初的Unity系统中&#xff0c;只有键盘、鼠标、操作…

html实现好看的浪漫爱情回忆录(附源码)

文章目录 1.设计来源1.1 主界面1.2 主题描述1.3 照片墙详细界面1.4 相关跳转界面 2.效果和源码2.1 效果演示2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130946811 html实现好看的浪漫爱情回忆录…

Unity发布WebGL报错il2cpp.exe did not run properly

解决&#xff1a;路径中不能有任何中文&#xff0c;包括用户名都不能是中文 win10修改用户名为英文&#xff1a; 1、开启administrator账户。 1&#xff09;、右键我的电脑&#xff0c;选择管理。 2&#xff09;、本地用户和组—用户—Administrator 3&#xff09;、右键—属性…

C++11新特性:decltype类型推导

上一节所讲的 auto&#xff0c;用于通过一个表达式在编译时确定待定义的变量类型&#xff0c;auto 所修饰的变量必须被初始化&#xff0c;编译器需要通过初始化来确定 auto 所代表的类型&#xff0c;即必须要定义变量。若仅希望得到类型&#xff0c;而不需要(或不能)定义变量的…

yum安装最新版的PHP、MySQL

本地环境&#xff1a;AlmaLinux9.2 在阿里的镜像源站点有一个叫remi的源&#xff0c;这个源专门提供了php的各种版本&#xff0c;目前这个源只针对Redhat、Centos和Fedora系统 Remi镜像简介 Remi镜像主页 配置Remi镜像源 这里以Enterprise Linux 9 为例 配置向导 根据配置向…

关于机器人状态估计(15)-VIO与VSLAM精度答疑、融合前端、主流深度相机说明与近期工程汇总

VIOBOT种子用户有了一定的数量&#xff0c;日常大家也会进行交流&#xff0c;整理总结一下近期的交流与答疑。 VIO-SLAM(作为三维SLAM&#xff0c;相对于Lidar-SLAM和LIO-SLAM)在工程上落地的长期障碍&#xff0c;不仅在算法精度本身&#xff0c;还有相对严重的鲁棒性问题&…

【Linux】iptables防火墙

文章目录 一、Linux防火墙基础1.Linux防火墙概术2.netfilter/iptables3.四表五链4.规则链之间的匹配顺序 二、iptables 安装1.常用的控制类型2.常用的管理选项 三、示例演示1.添加新的规则2.查看规则列表3.删除规则4.清空规则 四、规则的匹配1.通用匹配2.隐含匹配3.显式匹配 一…