leetcode 虐我篇之(十七)Binary Tree Level Order Traversal

        二叉树的前中后序遍历都做完了,现在就到层级遍历了Binary Tree Level Order Traversal,题目描述如下:

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example:
Given binary tree {3,9,20,#,#,15,7},
    3
   / \
  9  20
    /  \
   15   7
return its level order traversal as:
[
  [3],
  [9,20],
  [15,7]
]
confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

        这里面的层级输出跟我们在书上看到的还不太一样,如果是直接输出的话,直接一个用一个队列保存结点,然后遍历队列,将出队列的结点的左右儿子结点继续进队列,循环直到队列为空就好。但是现在每层还要单独分出来。一开始我是想着根据二叉树的性质,每层有多少个元素然后看结点在队列中是第几个,那么满足一定条件就要换一层去存储。但是用数据模拟了一下,感觉还挺麻烦的,中间有些结点过早结束怎么办(即不是完全二叉树的时候)?纠结了好一会儿,想到,能不能再搞一个队列,先把现在这一层的结点放在第一个队列中,然后遍历队列1,将其儿子结点放在队列2中,当队列1为空的时候,那么就说明这一层结束了,准备进入下一层了。按照这个思路,代码如下:

std::vector<std::vector<int> > levelOrder(TreeNode *root)
{
	std::vector<std::vector<int> > result;
	std::vector<int> temp;
	std::queue<TreeNode *> treeQueue1,treeQueue2;

	if (!root)
	{	
		return result;
	}
	
	treeQueue1.push(root);
	
	TreeNode *node = NULL;

	while(!treeQueue1.empty() || !treeQueue2.empty())
	{
		if (!treeQueue1.empty())
		{
			node = treeQueue1.front();
			treeQueue1.pop();
			if (node->left)
			{
				treeQueue2.push(node->left);
			}
			if (node->right)
			{
				treeQueue2.push(node->right);
			}

			temp.push_back(node->val);
						
		}
		
		if (treeQueue1.empty())
		{
			//this means that this level is over
			result.push_back(temp);
			temp.clear();
			treeQueue1.swap(treeQueue2);	//swap two queue
		}	
		
	}
	
	return result;
}

        做完这道题,看了一下题解,里面有两种方法,一种跟我这个差不多,另外一种用到了递归,感觉高级很多,怎么当时我就没想到呢?!还需努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值