【剑指】69,按之打印二叉树(

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

【新思路:】将只需要用一个队列就可。和层序遍历是一样的方式,但是在不同的行以不同的方向进入tmp数组,这里具体实现是通过用一个队列,队列里面的是一行的所有节点,创建一个队列节点大小的tmp数组,然后按照是该从左到右还是从右到左的方式给数组赋值 index=lefttoright ? i: n-1-i ;

思路:
要按照之打印。首先给的是根节点(代表从左到右了),接下来要从右到左。我们可以用两个栈来存放不同顺序的节点。stackL存放从左到右的,stackR存放从右到左的。当一边为空后要push入res中。
在压入
在压入每一行的时候,要注意判断是否为空的情况。

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
    	vector<vector<int>> res;
    	if(pRoot==nullptr)
    		reuturn res;
    	stack<TreeNode*> stackL;
    	stack<TreeNode*> stackR;
    	vector<int>tmp;
    	//将第一个放入栈中.流程打个样!
    	stackL.push(pRoot);
    	tmp.push_back(pRoot->val);
    	res.push_back(tmp);
    	tmp.clear();
    	TreeNOde* popNode;

		while(!stackL.empty()|| !stackR.empty())	//当两者当中有一个不为空就继续
		{
			//判断左到右边的栈
			while(!stackL.empty())
			{
				popNode=stackL.top();
				stackL.pop();			//有顺序,从右到左
				if(popNode->right!=nullptr)
				{
					stackR.push_back(popNode->right);
					tmp.push_back(popNode->right->val);
				}
				if(popNode->left!=nullptr)
				{
					stackR.push_back(popNode->left);
					tmp.push_back(popNode->left->val);
				}
				//左边栈解决完了,转移到右边的栈。要处理.	但是注意是当tmp不为空才可以push_back!
				if(!tmp.empty())
				{res.push_back(tmp);
					tmp.clear();
			}
				while(!stackR.empty())
			{
				popNode=stackR.top();
				stackR.pop();			//有顺序,left to right
				
				if(popNode->left!=nullptr)
				{
					stackR.push_back(popNode->left);
					tmp.push_back(popNode->left->val);
				}
				if(popNode->right!=nullptr)
				{
					stackR.push_back(popNode->right);
					tmp.push_back(popNode->right->val);
				}

			//到这里之后某一边的被彻底解决了
			if(!tmp.empty())
				{res.push_back(tmp);
					tmp.clear();
				}
			}
		}
		return 	res;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值