按之字形顺序打印二叉树

https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?tpId=13&tqId=11212&tPage=3&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

思路:建立两个栈,栈1是储存奇数层的,栈2是储存偶数层的。然后在打印某一层的时候记得把那一层的子节点储存到另一个栈就是了。比如

在打印奇数层的时候,就是相当于操作栈1,把栈1的节点一个个弹出来,并且把该层的每个节点按照左孩子,右孩子储存到栈2中,

而在打印偶数层节点的时候 ,把栈2的节点一个个弹出来,并且把该层的每个节点按照右孩子,左孩子储存到栈1中,

当两个栈,就是栈1和栈2都是空的时候程序退出,就是程序的打印结果完毕。


struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};

class Solution {
public:
	stack<TreeNode*>stack1;
	stack<TreeNode*>stack2;
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int> >res;
		if(pRoot == nullptr)
			return res;

		stack1.push(pRoot);//第一层是奇数层,奇数层节点储存到栈1
		bool flag = true;//判断打印那一层,true打印奇数层,false打印偶数层
		while(!stack1.empty() || !stack2.empty() )
		{
			if(flag)//打印奇数层,就是把栈1的结果弹出来
			{
				vector<int>temp;
				while(!stack1.empty() )
				{
					TreeNode * x = stack1.top();
					temp.push_back (x ->val);
					//按照左右孩子的顺序把子节点放到栈2中
					if(x ->left)
						stack2.push(x->left);
					if(x -> right)
						stack2.push(x ->right);

					stack1.pop();
					
				}
				res.push_back (temp);//放到结果集中

				flag = false;//改标志,表明下一次打印偶数层

			}
			else
			{
				vector<int>temp;
				while(!stack2.empty() )
				{
					TreeNode * x = stack2.top();
					temp.push_back (x -> val);
					//按照右 左孩子的顺序把子节点放到栈1中
					if(x ->right)
						stack1.push(x -> right);
					if(x -> left)
						stack1.push(x -> left);
					stack2.pop();
				}
				res.push_back (temp);
				flag = true;//改标志,表明下一次打印奇数层

			}
		}
		return res;
        
        
    }
	
    
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值