码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode | Binary Tree Level Order Traversal

时间:2015-04-06 17:23:37      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:leetcode   二叉树   广度优先遍历   

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]
]

思路:本题需要按层从左到右输出每层的结点值,放在一个二维数组中。那么首先可以用二叉树的广度优先算法,将结点按按层排序好,放在一个一维数组中,问题是如何知道数组中的每个点分别是在第几层?

这边需要注意的是,在用广度优先算法的时候,我是将空结点也放进了数组中。即若某结点p的左子树如果为空,则也将指向这颗空子树的指针也放进数组中。

下面来看如何知道数组中每个结点分别是二叉树第几层的结点。

很显然,第一层的结点即是数组中的第一个结点,记为v[0],那么第二层的结点,就是v[1],v[2],第三层就是v[3],v[4],v[5],v[6]。以此类推。

真的就是这么简单,显然不是。上面的这种情况二叉树是满二叉树(即每层结点都是满的),所以如果不是满二叉树,那么又该如何来做呢?

做法就是在遍历每一层的每一个结点时,我们可以记一个数cnt,如果该结点存在,就把cnt = cnt + 2;否则就不需要加2。这样的做法,就可以知道实际的下一层一共有多少个结点。因此,一旦我们知道了下一层的结点总数 (即每一层的结点总数),就可以从数组中容易地区分每个结点在第几层。

我想大致思路应该是讲清楚了。

#include "stdafx.h"
#include <vector>
#include <queue>
#include <iostream>
using namespace std;

  struct TreeNode 
  {
     int val;
     TreeNode *left;
     TreeNode *right;
     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  };
 
class Solution {
public:
    vector<vector<int> > levelOrder(TreeNode *root) 
	{
		vector<vector<int> > vv;//最终的结果,一个二维向量(数组)
		vector<int> v;<span style="white-space:pre">		</span>//一个存放每层结点元素值的临时向量(不包括空结点)
		vector<TreeNode*> vt;<span style="white-space:pre">	</span>//这个向量存放到即是每层的结点(包括空结点)
		queue<TreeNode*> L;<span style="white-space:pre">	</span>//广度优先时,用到的辅助队列
		TreeNode* t;
		int i,j;
		if(root)<span style="white-space:pre">		</span>//广度优先
		{
			v.push_back(root->val); 
			vv.push_back(v); //这边直接将第一层的结点元素值,放进最终结果了
		}
		L.push(root);
		while(!L.empty())
		{
			t = L.front();
			vt.push_back(t);
			L.pop();
			if(!t)
				continue;
			L.push(t->left);
			L.push(t->right);
		}
		int step = 3;
		int cnt = 0;
		for(i=1; i<vt.size(); i=j)//从第二层开始
		{
			v.clear();<span style="white-space:pre">	</span>//清空<span style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;">存放每层结点元素值的临时向量</span>
			for(j=i; j<vt.size() && j<step; ++j)
			{
				if(vt[j])//不是空结点,则将结点元素值放入临时向量中,并将计数值+2
				{
					v.push_back(vt[j]->val);
					cnt+=2;
				}
			}
			step = j+cnt;//下一层的实际结点树
			cnt = 0;<span style="white-space:pre">	</span>//计数值清零
			if(!v.empty())
				vv.push_back(v);//每一层实际结点元素值,放入最终结果向量中
		}
		return vv;
    }
};


LeetCode | Binary Tree Level Order Traversal

标签:leetcode   二叉树   广度优先遍历   

原文地址:http://blog.csdn.net/dream_whui/article/details/44902175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!