数据结构与算法之树的入门(二叉树)(三)

简介: 数据结构与算法之树的入门(二叉树)

七、二叉树的最大深度问题


需求:


给定一棵树,请计算树的最大深度(树的根节点到最远叶子结点的最长路径上的结点数)


add2332a8c1d4ec785e78a2e431535eb.png

上面这棵树的最大深度为4。


实现:


我们在1.4中创建的树上,添加如下的API求最大深度:


public int maxDepth() :计算整个树的最大深度


private int maxDepth(Node x): 计算指定树x的最大深度


实现步骤


1.如果根结点为空,则最大深度为0;


2.计算左子树的最大深度;

3.计算右子树的最大深度;

4.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1


代码:

// 计算整个树的最大深度
public int maxDepth() {
  return maxDepth(root);
}
//计算指定树x的最大深度
private int maxDepth(Node x) {
  //1.如果根结点为空,则最大深度为0;
  if (x == null) {
    return 0;
  }
  int max = 0;
  int maxL = 0;
  int maxR = 0;
  //2.计算左子树的最大深度;
  if (x.left != null) {
    maxL = maxDepth(x.left);
  }
  //3.计算右子树的最大深度;
  if (x.right != null) {
    maxR = maxDepth(x.right);
  }
  //4.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1
  max = maxL > maxR ? maxL + 1 : maxR + 1;
  return max;
}
//测试代码
public class Test {
  public static void main(String[] args) throws Exception {
    BinaryTree<String, String> bt = new BinaryTree<>();
    bt.put("E", "5");
    bt.put("B", "2");
    bt.put("G", "7");
    bt.put("A", "1");
    bt.put("D", "4");
    bt.put("F", "6");
    bt.put("H", "8");
    bt.put("C", "3");
    int i = bt.maxDepth();
    System.out.println(i);
  }
}

八、折纸问题


需求:


请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。


给定一 个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向 例如:N=1时,打印: down;N=2时,打印: down down up


9a57d8fe8c3142d58b574f5d2a4dea6f.png

分析:


我们把对折后的纸张翻过来,让粉色朝下,这时把第一次对折产生的折痕看做是根结点,那第二次对折产生的下折痕就是该结点的左子结点,而第二次对折产生的上折痕就是该结点的右子结点,这样我们就可以使用树型数据结构来描述对折后产生的折痕。


这棵树有这样的特点:


1.根结点为下折痕;

2.每一个结点的左子结点为下折痕;

3.每一个结点的右子结点为上折痕;


8ed42df6b08b455fb226331add2ddaf0.png

实现步骤:


1.定义结点类

2.构建深度为N的折痕树;

3.使用中序遍历,打印出树中所有结点的内容;


构建深度为N的折痕树:


1.第一次对折,只有一条折痕,创建根结点;

2.如果不是第一次对折,则使用队列保存根结点;

3.循环遍历队列:

3.1从队列中拿出一个结点;

3.2如果这个结点的左子结点不为空,则把这个左子结点添加到队列中;

3.3如果这个结点的右子结点不为空,则把这个右子结点添加到队列中;

3.4判断当前结点的左子结点和右子结点都不为空,如果是,则需要为当前结点创建一个值为down的左子结点,一个值为up的右子结点。


代码:


public class PaperFolding {
  public static void main(String[] args) {
    //构建折痕树
    Node tree = createTree(3);
    //遍历折痕树,并打印
    printTree(tree);
  }
  //3.使用中序遍历,打印出树中所有结点的内容;
  private static void printTree(Node tree) {
    if (tree==null){
      return;
    }
    printTree(tree.left);
    System.out.print(tree.item+",");
    printTree(tree.right);
  }
  //2.构建深度为N的折痕树;
  private static Node createTree(int N) {
      Node root = null;
    for (int i = 0; i <N ; i++) {
      if (i==0){
        //1.第一次对折,只有一条折痕,创建根结点;
        root = new Node("down",null,null);
      }else{
        //2.如果不是第一次对折,则使用队列保存根结点;
        Queue<Node> queue = new Queue<>();
        queue.enqueue(root);
        //3.循环遍历队列:
        while(!queue.isEmpty()){
          //3.1从队列中拿出一个结点;
          Node tmp = queue.dequeue();
          //3.2如果这个结点的左子结点不为空,则把这个左子结点添加到队列中;
          if (tmp.left!=null){
            queue.enqueue(tmp.left);
          }
          //3.3如果这个结点的右子结点不为空,则把这个右子结点添加到队列中;
          if (tmp.right!=null){
            queue.enqueue(tmp.right);
          }
          //3.4判断当前结点的左子结点和右子结点都不为空,如果是,则需要为当前结点创建一个值为down的左子结点,一个值为up的右子结点。
          if (tmp.left==null && tmp.right==null){
            tmp.left = new Node("down",null,null);
            tmp.right = new Node("up",null,null);
          }
        }
      }
    }
    return root;
  }
  //1.定义结点类
  private static class Node{
    //存储结点元素
    String item;
    //左子结点
    Node left;
    //右子结点
    Node right;
    public Node(String item, Node left, Node right) {
      this.item = item;
      this.left = left;
      this.right = right;
    }
  }
}


目录
相关文章
|
4月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
4月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
129 17
|
4月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
118 7
|
6月前
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
182 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
6月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
168 10
 算法系列之数据结构-二叉树
|
6月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
145 3
 算法系列之数据结构-Huffman树
|
6月前
|
机器学习/深度学习 算法 机器人
强化学习:时间差分(TD)(SARSA算法和Q-Learning算法)(看不懂算我输专栏)——手把手教你入门强化学习(六)
本文介绍了时间差分法(TD)中的两种经典算法:SARSA和Q-Learning。二者均为无模型强化学习方法,通过与环境交互估算动作价值函数。SARSA是On-Policy算法,采用ε-greedy策略进行动作选择和评估;而Q-Learning为Off-Policy算法,评估时选取下一状态中估值最大的动作。相比动态规划和蒙特卡洛方法,TD算法结合了自举更新与样本更新的优势,实现边行动边学习。文章通过生动的例子解释了两者的差异,并提供了伪代码帮助理解。
410 2
|
8月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
249 3
|
9月前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
133 5
|
10月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
134 0

热门文章

最新文章