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

2023-11-05

目录

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







 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Qt开发 之 删除文件或文件夹到回收站(详解)

    文章目录 1 简介 1 1 问题描述 1 2 解决方案 2 源代码 2 1 WinAPI调用 2 2 两行代码解决Release版本根目录驱动问题 2 3 解决部分文件删除不成功的问题 3 QFileInfo官方说明 4 Qt 5 15版本
  • 利用HashSet求集合的交集、并集

    package com test import java util ArrayList import java util HashSet import java util Iterator import java util Set publ
  • Shell 脚本等待上一行执行完成再执行下一行的方法

    在开发中 我们有时候需要使用 Shell 脚本完成一些简单的操作 但是往往有的操作比较耗时 但是我们又不得不等待它执行完成后才能进行下面的步骤 所以许多朋友往往使用sleep等方法来强制等待操作完成 其实完全没有必要 我们只需要使用一个小小
  • sqoop:【error】ERROR tool.ImportTool: Import failed: java.io.IOException: Filesystem closed

    19 06 06 12 04 08 ERROR tool ImportTool Import failed java io IOException Filesystem closed at org apache hadoop hdfs DF
  • 机器学习——图片处理应用(人脸补全)

    0 前言 本文内容是机器学习算法回归预测的应用 其中数据集主要来自sklearn库自带的人脸数据 目的是通过KNN回归 线性回归 岭回归算法通过人物的左半张脸预测人物的右半张脸 意义1 通过该项目掌握图片数据在机器学习当中的处理方法 意义2
  • 统计学习方法学习梳理(一)统计学习的分类

    目录 1 基本分类 1 监督学习 2 无监督学习 3 强化学习 4 半监督学习 5 主动学习 2 按模型分类 1 概率模型与非概率模型 2 线性模型与非线性模型 3 参数化模型与非参数化模型 3 按算法分类 1 在线学习 2 批量学习 4
  • 为什么区块链宠物得到这么多资本家的青睐?

    区块链宠物最早进入人们视野是一款由Axiom Zen和以太坊智能合作开发的区块链宠物养成游戏 谜恋猫 也有人称其为加密猫 这款游戏基于以太坊产生 通过以太坊区块链上的智能合约进行追踪 用户需使用以太币购买猫咪 并通过智能合约自动分配 每15
  • typora的使用

    typora的使用 1 换行的实现 在一行的结尾加上两个空格实现换行 在两行之间加回车实现换行 2 标题 多少个 就多少级标题 一共六级标题 记得输完 要加空格 1 2 3 4 5 6 3 分割线 就出现分割线 要回车 4 强调 斜体 字体
  • numpy 寻找两个二维数组中重复的行(附代码)

    numpy 两个 N M 维度的 二维数组a 和 b 以行为单位 找到 a 和 b 中都存在的行 相同的行不一定出现在同一行的位置 通过遍历每一行寻找 import numpy as np 创建两个示例数组 a sorted np arra
  • 玩转触发器之Jenkins Generic Webhook使用技巧

    1 预备知识 目标 学习HTTP基础知识 掌握如何使用Postman和Curl调用接口的方法 1 1 Web HTTP基础知识 HTTP请求是什么 HTTP超文本传输协议 是确保服务器 Server 和客户端 Client 之间的正确通信
  • php同时作为server端和client端(soapclient)的超时时间设置小结

    http blog sina com cn s blog 475429950101bt7x html 场景 A通过HTTP请求B 同时B通过soap请求C webservice 然后B得到C的返回内容后 再响应回A client A gt
  • Linux系统编程——线程

    Linux系统编程 线程 1 线程概述 与进程的区别及线程的优势 2 线程创建等待退出 3 线程共享内存空间的代码验证 4 线程同步之互斥量加锁解锁 5 互斥锁限制共享资源的访问 6 什么情况造成死锁 7 线程条件控制实现线程的同步 1 线
  • 【基于Arduino的蓝牙控制小车】3D+电路图+控制代码详解

    更好的阅读体验 目录 1 环境搭建 1 1 电路模拟环境 3D建模环境 1 2蓝牙小车控制代码环境 2 Arduino串口通信 2 1 Arduino串口 2 2 系统函数 2 3 串口函数 2 3 1 Serial begin 2 3 2
  • STM32 websocket,TCP和UDP的传输速率

    网络上经常有人提到websocket TCP和UDP 的差别 说的大都是协议之间的差别 没有提及它们的传输能力 为了设计高吞吐量的物联网微服务器 最近对websocket TCP UDP的传输能力做了测试 使用STM32F746 处理器 操
  • 建立自己的机械臂–编程

    现在 手臂已经组装好了 是时候将其提升到一个新的水平了 现在是释放野兽并完全控制整个机器人手臂的时候了 在这篇文章的结尾 您应该对如何对该机械臂进行编程以完成您想要的事情有一个想法 要了解我如何到达这里 请访问我以前的文章 该文章描述了组装
  • Library\PackageCache\com.unity Error (are you missing a using directive or an assembly reference?)

    Library PackageCache com unity cinemachine 2 2 7 Runtime Timeline CinemachineTrack cs 16 6 error CS0246 The type or name
  • PAT考试 一日游记

    今天下午去考了PAT 真的很懵逼 首先 编译器炸了 弄了一个小时多的编译器 早知道就先不点击开始了 然后就是遇到了头文件CB不能调试 主要是用了unorder map unorder set 习惯性写的头文件 开局先默写头文件 然后就这样
  • MFC菜单的使用

    1 创建弹出菜单 1 利用向导 创建一个基于单文档的应用程序 2 在资源视图中选中 menu 鼠标右键插入一新菜单IDR POPMENU 3 在IDR POPMENU菜单中添加 弹出菜单 选项 在 弹出菜单 下添加菜单命令 复制 粘贴 查找
  • getResourceAsStream方法及缓存问题

    缓存问题 getResourceAsStream会先到缓存中读取文件 若缓存中没有 才会到真正的路径下去读取文件 所以用getResourceAsStream方法获取配置文件时 获取的不是最新配置 可以使用以下方法代替 该方法直接读文件 所
  • 算法(63)-二叉树的递归-搜索二叉树-满二叉树-平衡二叉树-

    目录 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