ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法与数据结构(六):树之折纸问题

2020-12-12 14:31:43  阅读:189  来源: 互联网

标签:node Node 结点 null 算法 折纸 数据结构 节点 折痕


算法与数据结构(六):树之折纸问题

  • 博主会对算法与数据结构会不断进行更新,敬请期待,如有什么建议,欢迎联系。
  • 树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家谱、单位的组织架构、等等。树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
  • 树的相关术语:

结点的度:
一个结点含有的子树的个数称为该结点的度;
叶结点:
度为0的结点称为叶结点,也可以叫做终端结点
分支结点:
度不为0的结点称为分支结点,也可以叫做非终端结点
结点的层次:
从根结点开始,根结点的层次为1,根的直接后继层次为2,以此类推
结点的层序编号:

将树中的结点,按照从上层到下层,同层从左到右的次序排成一个线性序列,把他们编成连续的自然数。
树的度:

树中所有结点的度的最大值
树的高度(深度)

树中结点的最大层次
森林:

m(m>=0)个互不相交的树的集合,将一颗非空树的根结点删去,树就变成一个森林;给森林增加一个统一的根结点,森林就变成一棵树

孩子结点:
一个结点的直接后继结点称为该结点的孩子结点
双亲结点(父结点):
一个结点的直接前驱称为该结点的双亲结点
兄弟结点:
同一双亲结点的孩子结点间互称兄弟结点

折纸问题:

  • 请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一 个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向 例如:N=1时,打印: down;N=2时,打印: down down up

实现思路:

  • 对于折纸问题,完全二叉树是一种实现思路,把第一次折痕看做这个树的根节点,左边的折痕为down,右边的折痕为up,每折一次都对叶子节点进行增加两个子节点,左子节点为down,右子节点为up
  • 找到叶子节点通过层序遍历查找,也可通过前序,中序,后序遍历查找到叶子节点
  • 打印从上到下打印折痕,说明是中序遍历打印

折纸问题的实现代码如下:


package com.victor.tree;

import com.victor.linear.Queue;

/**
 * @description: 利用完全二叉树解决折纸问题
 * @author: victor
 * @date: 2020/12/12  9:41
 */
public class PageFolding {
    public static void main(String[] args) {
        Node<String> tree = createTree(2);
        printTree(tree);
    }

    /**
     * 内部类节点类
     *
     * @param <T> 泛型
     */
    private static class Node<T> {
        T item;
        Node<T> left;
        Node<T> right;

        public Node(T item, Node<T> left, Node<T> right) {
            this.item = item;
            this.left = left;
            this.right = right;
        }
    }

    /**
     * 生成N层深度的树
     *
     * @param N 深度
     * @return 树
     */
    public static Node<String> createTree(int N) {

        Node<String> root = null;   //定义根节点

        for (int i = 0; i < N; i++) {
            //第一层
            if (i == 0) {
                root = new Node<>("down", null, null);
                continue;
            }
            //层序遍历,找到叶子节点,将down和up放进去
            Queue<Node<String>> nodes = new Queue<>();
            nodes.enqueue(root);    //放入根节点
            while (!nodes.isEmpty()) {
                Node<String> node = nodes.dequeue();
                //如果有左子节点,把左子节点放入队列中
                if (node.left != null) nodes.enqueue(node.left);
                //如果有右子节点,把右子节点放入队列中
                if (node.right != null) nodes.enqueue(node.right);
                //如果没有左子节点,也没有右子节点,生成新的节点
                if (node.left == null && node.right == null) {
                    node.left = new Node<>("down", null, null);
                    node.right = new Node<>("up", null, null);
                }
            }
        }

        return root;
    }

    /**
     * 以递归的方式,采用中序遍历打印树
     *
     * @param node 树
     */
    public static void printTree(Node<String> node) {
        //如果为null直接返回
        if (node == null) return;
        //打印左子树
        if (node.left != null) printTree(node.left);
        //打印节点
        System.out.print(node.item + " ");
        //打印右子树
        if (node.right != null) printTree(node.right);

    }

}

标签:node,Node,结点,null,算法,折纸,数据结构,节点,折痕
来源: https://blog.csdn.net/weixin_48709775/article/details/111060155

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有