二叉树的锯齿形层次遍历

给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行

    3
   / \
  9  20
    /  \
   15   7

返回其锯齿形的层次遍历为:

[
  [3],
  [20,9],
  [15,7]
]
#include <vector>
#include<deque>

using namespace std;


//Definition of TreeNode :
class TreeNode {
public:
	int val;
	TreeNode *left, *right;
	TreeNode(int val) {
		this->val = val;
		this->left = this->right = NULL;
	}
};

class Solution {
	/**
	* @param root: The root of binary tree.
	* @return: A list of lists of integer include
	*          the zigzag level order traversal of its nodes' values
	*/
public:

	TreeNode* Init(TreeNode* &root)
	{
		char ch = ' ';
		cin >> ch;

		if ('#' == ch)
		{
			root = NULL;
		}
		else
		{
			root = new TreeNode(atoi(&ch));
			Init(root->left);
			Init(root->right);
		}

		return root;
	}


	vector<vector<int>> zigzagLevelOrder(TreeNode *root) {
		// write your code here
		vector<int > elem;
		vector<vector<int > > result;

		if (NULL == root)
		{
			return result;
		}
		deque<TreeNode* > deq;
		TreeNode* temp = NULL;
		deq.push_back(root);
		int leverTotalNode = 0;
		int currnet = 0;
		bool flag = false;//标记从前还是从后向前打印
		elem.push_back(root->val);
		result.push_back(elem);
		elem.resize(0);

		while (!deq.empty())
		{
			leverTotalNode = deq.size();
			currnet = 0;
			
			while (currnet<leverTotalNode)
			{
				temp = deq.front();
				deq.pop_front();
				if (temp->left != NULL)
				{
					deq.push_back(temp->left);
					elem.push_back(temp->left->val);
				}

				if (NULL != temp->right)
				{
					deq.push_back(temp->right);
					elem.push_back(temp->right->val);
				}
				currnet++;
			}

			if (elem.size()!=0)
			{
				if (flag == false)//从后向前
				{
					reverse(elem.begin(), elem.end());
				}

				flag = !flag;
				result.push_back(elem);
				elem.resize(0);
			}
		}

		return result;
	}
};

int main()
{
	TreeNode* root = NULL;
	Solution s;
	root = s.Init(root);
	vector<vector<int > > result = s.zigzagLevelOrder(root);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值