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

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

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


需求:


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


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


目录
相关文章
|
15天前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
52 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
15天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
39 12
|
15天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
38 10
|
15天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
39 2
|
30天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
54 5
|
29天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
91 5
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
117 4
|
2月前
|
算法
数据结构之文件系统模拟(树数据结构)
本文介绍了文件系统模拟及其核心概念,包括树状数据结构、节点结构、文件系统类和相关操作。通过构建虚拟环境,模拟文件的创建、删除、移动、搜索等操作,展示了文件系统的基本功能和性能。代码示例演示了这些操作的具体实现,包括文件和目录的创建、移动和删除。文章还讨论了该算法的优势和局限性,如灵活性高但节点移除效率低等问题。
80 0
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
292 9

热门文章

最新文章