C++折纸问题

问题描述

给定输入参数N,代表纸条从下边向上方对折N次,请从上到下打印所有折痕方向

分析

1.将一张纸分为粉,黑两面,粉色为正面,黑色为反面。
2.第一次对折时粉色朝上,对折之后产生一个向下的折痕,这时我们把对折之后的纸粉色朝下,让折痕朝上把这个折痕看成是二叉树的根结点。
3.第二次对折新产生的两个折痕就是根结点的子节点,
4.之后每一次对折都产生一层结点
5.我们规定左节点为下折痕,右节点为上折痕
6.从上到下打印这很方向就是这棵树的中序遍历
在这里插入图片描述
在这里插入图片描述

代码

class paperNode
{
public:
    string item;
    paperNode* left;
    paperNode* right;
    paperNode(){}
    paperNode(string item, paperNode* left, paperNode* right) {
        this->item = item;
        this->left = left;
        this->right = right;
    }
    paperNode(const paperNode& x) {
        this->item = x.item;
        this->left = x.left;
        this->right = x.right;
    }
};


void printTree(paperNode* x);
paperNode* createTree(int n);


//折纸问题
void paperfolding(int n){
    //构建折痕树,这棵树的根结点是下折痕,左子节点是下折痕,右子结点是上折痕;
    //每一层就是一次对折
    //中序遍历的结果就是从上到下折痕的输出
    paperNode* tree = createTree(n);
    printTree(tree);
}
//创建深度为N的折痕树:即对折N次的折纸
paperNode* createTree(int n){
    string down = "down";
    string up = "up";
    paperNode* root;
    for(int i = 0; i < n; i++){
        //如果是第一次折纸,初始化根结点
        if(i == 0){
            root = new paperNode(down, nullptr, nullptr);
        }
        else{
            //每一次对折都需要增加一层结点,所以需要模拟层序遍历的过程

            //创建一个辅助队列,并将根结点加入队列中
            queue<paperNode*> temp;
            temp.push(root);
            paperNode* x;
            //层序遍历,直到找到最后一层
            while(!temp.empty()){
                x = temp.front();
                temp.pop();
                if(x->left != nullptr){
                    temp.push(x->left);
                }
                if(x->right != nullptr){
                    temp.push(x->right);
                }

                //如果左子节点和右子结点都为空则找到最后一层,生成新节点
                if(x->left == nullptr && x->right == nullptr){
                    x->left = new paperNode(down, nullptr, nullptr);
                    x->right = new paperNode(up, nullptr, nullptr);


                }

            }

        }
    }
    return root;

}

//中序遍历输出折痕
void printTree(paperNode* x){
    if(x == nullptr) return;
    if(x->left != nullptr) printTree(x->left);
    cout << x->item << endl;
    if(x->right != nullptr) printTree(x->right);
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页

打赏

漫步孤独之海

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者