leetcode/nowcoder-huawei-8-二叉树

文章介绍了如何使用递归方法进行二叉树的层次遍历,分别给出了从上到下正常顺序和之字形顺序打印二叉树的C++代码实现。通过深度优先搜索(DFS)策略,按层次压入节点值并处理层间顺序。
摘要由CSDN通过智能技术生成

8.二叉树

LeetCode 剑指offer - II从上到下打印二叉树 II

  1. 描述

    从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。 
    
    例如:
    给定二叉树: [3,9,20,null,null,15,7],
        3
       / \
      9  20
        /  \
       15   7
    返回其层次遍历结果:
    [
      [3],
      [9,20],
      [15,7]
    ]
    提示:
    节点总数 <= 1000
    
  2. 思路

    递归遍历,按层压入数据

  3. 代码

    #include <iostream>
    using namespace std;
    #include "../DataStructure/tree.h"
    
    class Solution {
        vector<vector<int>> res;
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            dfs(root, 0);
            return res;
        }
    
        void dfs(TreeNode *root, int depth) {
            if (!root)   return;
            if (depth >= res.size())  res.push_back({});
            res[depth].push_back(root->val);
            dfs(root->left, depth + 1);
            dfs(root->right,depth + 1);
        }
    };
    
    int main() {
        vector<int> nums = {3,9,20,-1,-1,15,7};
        Solution sol;
        TreeNode *root = init(nums);
        vector<vector<int>> res;
        res = sol.levelOrder(root);
        for (auto ls:res) {
            for (auto x:ls)
                printf("%d  ",x);
            printf("\n");
        }
        return 0;
    }
    

剑指 Offer 32 - III. 从上到下打印二叉树 III

  1. 描述

    请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 
    
    例如:
    给定二叉树: [3,9,20,null,null,15,7]
        3
       / \
      9  20
        /  \
       15   7
    返回其层次遍历结果:
    [
      [3],
      [20,9],
      [15,7]
    ] 
    
    提示:
    节点总数 <= 1000
    
  2. 思路

    根据前面的dfs算法压入值,获取结果后将对应行翻转

  3. 代码

    #include <iostream>
    using namespace std;
    #include "../DataStructure/tree.h"
    #include <algorithm>
    
    class Solution {
        vector<vector<int>> res;
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            dfs(root, 0);
            for(int i = 0; i < res.size(); i++) {
                if (i % 2 == 0) continue;
                reverse(res[i].begin(), res[i].end());
            }
            return res;
        }
        void dfs(TreeNode *root, int depth) {
            if (!root) return;
            if (depth >= res.size())    res.push_back({});
            res[depth].push_back(root->val);
            dfs(root->left, depth + 1);
            dfs(root->right, depth + 1);
        }
    };
    
    int main() {
        vector<int> nums = {3,9,20,-1,-1,15,7};
        TreeNode *root = init(nums);
        Solution sol;
        vector<vector<int>> res = sol.levelOrder(root);
        for (auto ls:res) {
            for (auto x:ls)
                printf("%d  ",x);
            printf("\n");
        }
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值