剑指offer-二叉树按之字形顺序打印

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

普通二叉树队列打印算法:

这道题我采用的算法是按照普通二叉树按层打印二叉树的队列思想来做的,这一段经典代码为:

//按层打印二叉树(队列的思想)
vector<int> PrintFromTopToBottom(BiTreeNode* T) {
	queue<BiTreeNode*> q;
	q.push(T);
	vector<int> r;
	while (!q.empty()) {
		T = q.front(); q.pop();
		if (!T) continue;
		r.push_back(T->data);
		q.push(T->lchild);
		q.push(T->rchild);
	}
	return r;

}

上述代码巧妙地利用了队列先进先出的性质解决二叉树不同层打印的问题“如何才能打印完一行再转下一行打印的笨问题”,利用队列队列头结点就可以实现“转下一行”的路线。

本题算法

维护两个栈,一个栈正向存储并打印,一个栈反向存储并打印,详细代码:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>>result;
       //TreeNode* TempNodeLeft,TempNodeRight;
        int number=2,num1=0,num2=0;
        stack<TreeNode *>s1;
        stack<TreeNode *>s2;
     int temp=9;
        vector<int>data1,data2;
         if(pRoot)//要加这句话
         {
        s1.push(pRoot);
         }
 
        while((!s1.empty())||(!s2.empty()))
        {
           /*if(number==1)
            {
                pRoot=s1.top();
                data1.push_back(pRoot->val);
                s1.pop();
                result.push_back(data1);
               data1.clear();
               number=number+1;
            }*/
            
            if(s1.empty()||(number%2==0&&number!=2))
           
            {
                pRoot=s2.top();
                data2.push_back(pRoot->val);
                    s2.pop();
                if(s2.empty())
                {
                result.push_back(data2);
                    data2.clear();
                
                }
            }
            else 
            {
            pRoot=s1.top();
            data1.push_back(pRoot->val);
            s1.pop();
                if(s1.empty())
                {
                result.push_back(data1);
                  data1.clear();
                }
            }
            if((number%2==0))
            {
              
                if(pRoot->left!=NULL)
                {
                   s1.push(pRoot->left);
                }
               
                if(pRoot->right!=NULL)
               {
                   s1.push(pRoot->right);
               }
                num1++;
       if(num1==pow(2,(number-2)))
       {
            number++;
          num1=0;
           continue;
       }
                else
                {
               continue;
                }
            }
            if(number%2==1)
            {
                   temp=1;
                if(pRoot->right!=NULL)
                {
                    s2.push(pRoot->right);
                }
                if(pRoot->left!=NULL)
                {
                    
                    s2.push(pRoot->left);
                }

        num2++;
            if(num2==pow(2,(number-2)))
                {
                number++;
                num2=0;
                continue;
            }
        else{
            continue;
        }
        } 
       
              }
       return result;
    }
     
    
    
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值