剑指offer32:从上到下打印二叉树

题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印

思路:典型的队列使用

void PrintFromTopToBottom(TreeNode* root) {
        if(root==nullptr)
            return ;
        queue<TreeNode*> q;
        q.push(root);
        while(!q.empty()){
            TreeNode* node = q.front();
            q.pop();
            cout<<node->val<<" ";
            if(node->left!=nullptr)
                q.push(node->left);
            if(node->right!=nullptr)
                q.push(node->right);
        }
    }

拓展1: 分层从上到下打印二叉树打印

分层打印时需要统计每一层的节点个数,当此层节点打印完时,输出换行符. 设置两个标记分别记录当前层剩余节点数和下一层的节点总数,当当前层打印完时,更新当前层与下一层节点数目.

void PrintFromTopToBottom(TreeNode* root) {
        if(root==nullptr)
            return ;
        queue<TreeNode*> q;
        q.push(root);
        int level =1;
        int next_l=0;
        while(!q.empty()){
            TreeNode* node = q.front();
            q.pop();
            level--;
            cout<<node->val<<" ";
            if(node->left!=nullptr){
                q.push(node->left);
                next_l++;
            }
            if(node->right!=nullptr){
                q.push(node->right);
                next_l++;
            }
            if(level==0){
                cout<<endl;
                level=next_l;
                next_l=0;
            }
        }
    }

拓展2:之字形打印二叉树

如上图所示,对于奇数层从左往右打印,偶数层从右往左打印. 在打印当前层节点时,子节点在下一层打印时是反向的,使用栈存储节点,使其先进后出. 使用两个栈,当是打印奇数层时,将子节点从左往右压栈,下一层打印时就能先打印右子节点. 当打印偶数层时,将子节点从右往左入栈,下一层节点打印时就能先打左子节点.

void PrintFromTopToBottom(TreeNode* root) {
    if(root==nullptr)
        return;
    stack<TreeNode*> st1;
    stack<TreeNode*> st2;
    st1.push(root);
    int level=1;
    while(!st1.empty() || !st2.empty()){
        if(level % 2!=0){//奇数层
            while(!st1.empty()){
                TreeNode* node = st1.top();
                st1.pop();
                cout<<node->val;
                if(node->left!=nullptr)
                    st2.push(node->left);
                if(node->right!=nullptr)
                    st2.push(node->right);
            }
            cout<<endl;
        }else{//偶数层
            while(!st2.empty()){
                TreeNode* node=st2.top();
                st2.pop();
                cout<<node->val;
                if(node->right!=nullptr)
                    st1.push(node->right);
                if(node->left!=nullptr)
                    st1.push(node->left);
            }
            cout<<endl;
        }
        level++;
    }
}