首页 > 编程语言 >剑指offer——Day06搜索与回溯算法(简单)

剑指offer——Day06搜索与回溯算法(简单)

时间:2022-11-15 15:47:40浏览次数:68  
标签:node right TreeNode offer Day06 回溯 push NULL left

Day6 2022.11.12 搜索与回溯算法(简单)

32.Ⅰ.从上到下打印二叉树

自己实现

用队列来实现。将当前节点的值打印后向queue中push它的左右非NULL儿子节点,并将该节点pop出去

代码如下

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> vec;
        if(root==NULL)return vec;
        queue<TreeNode*> list;
        TreeNode* now=root;
        list.push(root);
        while(list.size()!=0)
        {
            now=list.front();
            vec.push_back(now->val);
            if(now->left!=NULL)list.push(now->left);
            if(now->right!=NULL)list.push(now->right);
            list.pop();
        }
        return vec;
    }
};

代码表现

题解

与自己实现思路一致,不赘述

hint:

  • 仍然是最开始先判断一下树是否为空,并且在后面队列push的时候检查要push进去的节点是否为空再进行

32.Ⅱ.从上到下打印二叉树 Ⅱ

自己实现

和上一题大致一样,主要还是用队列来遍历。不同的主要就是要把每一层分开打印。主要就是这个判断是第几层的判断条件,是通过看题解理解的。如下列代码,在

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *       int val;
 *       TreeNode *left;
 *       TreeNode *right;
 *       TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
        vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> queue;
        vector<vector<int>> res;
        if(root != NULL) queue.push(root);
        while(queue.size()) {
                vector<int> tmp;
                for(int i = queue.size(); i > 0; i--) {       //控制切换层的关键条件
                    TreeNode* node = queue.front();
                    queue.pop();
                    tmp.push_back(node->val);
                    if(node->left != NULL) queue.push(node->left);
                    if(node->right != NULL) queue.push(node->right);
                }
                res.push_back(tmp);
        }
        return res;
    }
};

代码表现

完美咯

hint:

  • 判断树的不同层用代码中Line19行的for循环内判断来做,很不错。

32.Ⅲ.从上到下打印二叉树Ⅲ

自己实现

在Ⅱ的要求之上+之字形输出。用了两个vector:ltor, rtol来实现,交互存储

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<TreeNode*> ltor;
        vector<TreeNode*> rtol;
        vector<vector<int>> vec;
        if(root != NULL) ltor.push_back(root);
        int flag=0;     //1 for in rtol now, 0 for in ltor now
        while(ltor.size() || rtol.size())
        {
            vector<int> level;
            if(flag)
            {
                flag=0;
                for(int i=rtol.size();i>0;i--)
                {
                    TreeNode* node=rtol[rtol.size()-1];
                    rtol.pop_back();
                    level.push_back(node->val);
                    if(node->right!=NULL)ltor.push_back(node->right);
                    if(node->left!=NULL)ltor.push_back(node->left);
                }
            }
            else
            {
                flag=1;
                for(int i=ltor.size();i>0;i--)
                {
                    TreeNode* node=ltor[ltor.size()-1];
                    ltor.pop_back();
                    level.push_back(node->val);
                    if(node->left!=NULL)rtol.push_back(node->left);
                    if(node->right!=NULL)rtol.push_back(node->right);
                }
            }
            vec.push_back(level);
        }
        return vec;
    }
};

代码表现

题解

这个题很不错!双端队列啥的,有时间一定看一下这里

hint:

  • 自己实现的时候还是通过vector来实现了类似队列的功能,可以再多看看队列,对于树的遍历挺好用的

标签:node,right,TreeNode,offer,Day06,回溯,push,NULL,left
From: https://www.cnblogs.com/cspzyy/p/16892590.html

相关文章

  • 剑指offer——Day07搜索与回溯算法(简单)
    Day72022.11.13树的子结构26.树的子结构自己实现应该是用递归,具体没有思路,直接看题解了题解用两个函数isSubStructure()和recur()来解决。就不断去递归比较A的子树......
  • 剑指offer——Day03字符串(简单)
    Day32022.11.9字符串(简单)05.替换空格自己实现遍历字符串中查找空格位置,erase空格,insert"%20"代码如下:classSolution{public:stringreplaceSpace(strings)......
  • 剑指 Offer 58 - II. 左旋转字符串
    剑指Offer58-II.左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"ab......
  • 【剑指Offer学习】【面试题3 :二维数组中的查找】
    思路:规律从右上角开始,或左下开始。不能从左上角开始找,这样每次比较后向右和向下都是越来越大。publicclassP03_FindMaxInMatrix{/*规律从右上角开始:......
  • 拿下阿里自动化测试岗23k*14薪offer的全程面试记录解析以及总结
    一、自我介绍面试官您好!我叫xx,来自深圳,毕业之后一直从事于软件测试的工作,有做过保险、金融、电商等项目;有做过做功能测试、接口测试,自动化测试,在工作中积极主动、可以独立的......
  • 剑指 Offer 41. 数据流中的中位数 - 力扣(Leetcode)
    剑指Offer41.数据流中的中位数-力扣(Leetcode)分析维护两个堆,一个大根堆,一个小根堆。插入操作:当进行插入时,先判断大根堆中是否有元素,如果没有直接插入大根堆,若有......
  • 剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(Leetcode)
    剑指Offer59-I.滑动窗口的最大值-力扣(Leetcode)一.分析方法一:数组长度为1e5,k的大小为1e4,因此直接暴力计算会TLE。我们可以思考一个更复杂的问题:询问任意区间中的......
  • [回溯算法]leetcode40. 组合总和 II(c实现)
    题目给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中......
  • [回溯算法]leetcode216. 组合总和 III(c实现)
    题目找出所有相加之和为 n的 k 个数的组合,且满足下列条件:只使用数字1到9每个数字 最多使用一次 返回所有可能的有效组合的列表。该列表不能包含相同的组合两次......
  • 回溯算法解数独问题
    好久没写算法了,浅解个数独本篇代码以伪代码为主,主要讲解解题思路规则介绍:首先数独的游戏规则,每个九宫格每一行每一列每个数字只能出现一次(1-9)开局时会生成一些不......