剑指 Offer 第 6 天 搜索与回溯算法 (简单)

面试题32 - I. 从上到下打印二叉树

题目描述

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
在这里插入图片描述

返回:
[3,9,20,15,7]

思路

这个是层次遍历,一层一层的遍历,因此不能用dfs,只能用bfs,利用队列,在python中是deque

代码

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root :
            return []
        q = collections.deque()
        q.append(root)
        a = []
        while q :
            t = q.popleft()
            if t.left :
                q.append(t.left)
            if t.right :
                q.append(t.right)
            a.append(t.val)
        return a

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

题目描述

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

样例

输入描述同上一个题目
输出描述如下:

[
  [3],
  [9,20],
  [15,7]
]

思路

基本思想和上一个题目差不多,无非是结果存储的方式不一样

代码

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root :
            return []
        q = collections.deque()
        res = []
        q.append(root)
        while q:
            tmp = []
            for _ in range(len(q)):
                t = q.popleft()
                tmp.append(t.val)
                if t.left :
                    q.append(t.left)
                if t.right :
                    q.append(t.right) 
            res.append(tmp)
        return res

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

题目描述

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

样例

输入描述同上一题目
输出描述如下

[
  [3],
  [20,9],
  [15,7]
]

思路

写法和上一个题目差不多,二维数组存储时根据行数下标判断从左到右还是从右到左

代码

c++代码

class Solution {
    
    
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
    
    

        queue<TreeNode*> que;
        que.push(root);
        vector<vector<int>> g;
        vector<int> tmp;
        if(!root)return g;
        while(!que.empty()){
    
    
            int len = que.size();
            tmp.clear();
            while(len--){
    
    
                TreeNode* t = que.front();
                que.pop();
                tmp.push_back(t->val);
                if(t->left){
    
    
                    que.push(t->left);
                }
                if(t->right){
    
    
                    que.push(t->right);
                }
            }
            g.push_back(tmp);
        }
        for(int i=1;i<g.size();i+=2){
    
    
            reverse(g[i].begin(),g[i].end());
        }
        return g;
    }
};

python代码

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root :
            return []
        q = collections.deque()
        res = []
        q.append(root)
        i = 0
        while q:
            i = i + 1
            tmp = collections.deque()
            for _ in range(len(q)):
                t = q.popleft()
                if i%2==1 :
                   tmp.append(t.val)
                else :
                    tmp.appendleft(t.val)
                if t.left :
                    q.append(t.left)
                if t.right :
                    q.append(t.right) 
            res.append(list(tmp))
        return res

这篇文章如果对小伙伴们有帮助的话,希望点个赞支持一下~ 十分感谢~

在这里插入图片描述


猜你喜欢

转载自blog.csdn.net/weixin_46627433/article/details/122959376