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

该篇文章介绍了一种方法来实现二叉树的层次遍历,按照从上到下、从左到右的顺序打印各层节点。首先,通过递归函数先序创建二叉树,然后使用广度优先搜索(BFS)进行层次遍历,返回层次遍历的结果。代码中定义了TreeNode结构体,并提供了创建二叉树和层次遍历的函数。在主函数中,创建了一个示例二叉树并进行了层次遍历的演示。
摘要由CSDN通过智能技术生成

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

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

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

提示:

节点总数 <= 1000
//层序遍历 时间复杂度:O(n) 空间复杂度:O(n)
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    // TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
int n=-1;
//递归建树建树 这里是先序创建 
TreeNode* create(vector<int> tree){
    ++n;
    TreeNode *root;
    if(n>=tree.size()){//终止条件
        return NULL;
    }
    else{
        if(tree[n]==0){//输入为0,表明当前节点为空
            root = nullptr;
            
        }
        else{//否则表明当前节点不为空
            root = new TreeNode;
            root->val = tree[n];
            //返回左子树的根节点地址,赋值给root的左指针
            root->left = create(tree);
            // printf("%d %d\n", n, root->left);
            root->right = create(tree);
            // printf("%d %d\n", n, root->right);  
        }
    }
    return root;
}
//层序遍历树
vector<vector<int> > BFS(TreeNode *root){
    vector<vector<int> > v;
    if(root == nullptr) return v;//加上判断条件判断tree是否为null
    deque<TreeNode*> d;
    d.push_back(root);
    bool leftorright=true;//用于控制是从左到右还是从右向左,第一层是true,第二层是false
    while(!d.empty()){
        int size = d.size();
        vector<int> m;
        for(int i=0; i<size; i++){//依次循环遍历,用于分段加数组
            if(leftorright){
                TreeNode* node = d.front();//从左向右出
                m.push_back(node->val);
                d.pop_front();
                if(node->left != nullptr) d.push_back(node->left); //下一层从右向左出
                if(node->right != nullptr) d.push_back(node->right);  
            }
            else{
                TreeNode* node = d.back();//从右向左出
                m.push_back(node->val);
                d.pop_back();
                if(node->right != nullptr) d.push_front(node->right); //下一层从左向右出
                if(node->left != nullptr) d.push_front(node->left);
            }
        }
        v.push_back(m);
        leftorright = !leftorright;
    }
    return v;
}
int main(){
    vector<int> tree;
    tree.push_back(3);
    tree.push_back(9);
    tree.push_back(0);
    tree.push_back(0);
    tree.push_back(20);
    tree.push_back(15);
    tree.push_back(7);
    TreeNode *root = create(tree);
    vector<vector<int> > v = BFS(root);
    for(int i=0; i<v.size(); i++){
        for(int j=0; j<v[i].size(); j++){
            printf("%d ", v[i][j]);
        } 
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值