力扣练习——45 二叉树的锯齿形层次遍历

45 二叉树的锯齿形层次遍历

1.问题描述
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:

给定二叉树 [3,9,20,null,null,15,7],

3

/ \

9 20

 /  \

15 7

返回锯齿形层次遍历如下:

[

[3],

[20,9],

[15,7]

]

程序输出:

3 20 9 15 7

可使用以下main函数:

#include

#include

#include

#include

using namespace std;

struct TreeNode

{

int val;

TreeNode *left;

TreeNode *right;

TreeNode() : val(0), left(NULL), right(NULL) {}

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

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

};

TreeNode* inputTree()

{

int n,count=0;

char item[100];

cin>>n;

if (n==0)

    return NULL;

cin>>item;

TreeNode* root = new TreeNode(atoi(item));

count++;

queue<TreeNode*> nodeQueue;

nodeQueue.push(root);

while (count<n)

{

    TreeNode* node = nodeQueue.front();

    nodeQueue.pop();

    cin>>item;

    count++;

    if (strcmp(item,"null")!=0)

    {

        int leftNumber = atoi(item);

        node->left = new TreeNode(leftNumber);

        nodeQueue.push(node->left);

    }

    if (count==n)

        break;

    cin>>item;

    count++;

    if (strcmp(item,"null")!=0)

    {

        int rightNumber = atoi(item);

        node->right = new TreeNode(rightNumber);

        nodeQueue.push(node->right);

    }

}

return root;

}

int main()

{

TreeNode* root;

root=inputTree();

vector<vector<int> > res=Solution().zigzagLevelOrder(root);

for(int i=0; i<res.size(); i++)

{

    vector<int> v=res[i];

    for(int j=0; j<v.size(); j++)

        cout<<v[j]<<" ";

}

}
2.输入说明
首先输入结点的数目n(注意,这里的结点包括题中的null空结点)

然后输入n个结点的数据,需要填充为空的结点,输入null。
3.输出说明
输出结果,每个数据的后面跟一个空格。
4.范例
输入
7
3 9 20 null null 15 7
输出
3 20 9 15 7
5.代码

#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>

using namespace std;


struct TreeNode

{

	int val;

	TreeNode *left;

	TreeNode *right;

	TreeNode() : val(0), left(NULL), right(NULL) {}

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

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

};

TreeNode* inputTree()

{

	int n, count = 0;

	char item[100];

	cin >> n;

	if (n == 0)

		return NULL;

	cin >> item;

	TreeNode* root = new TreeNode(atoi(item));

	count++;

	queue<TreeNode*> nodeQueue;

	nodeQueue.push(root);

	while (count < n)

	{

		TreeNode* node = nodeQueue.front();

		nodeQueue.pop();

		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int leftNumber = atoi(item);

			node->left = new TreeNode(leftNumber);

			nodeQueue.push(node->left);

		}

		if (count == n)

			break;

		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int rightNumber = atoi(item);

			node->right = new TreeNode(rightNumber);

			nodeQueue.push(node->right);

		}

	}

	return root;

}

vector<vector<int> > zigzagLevelOrder(TreeNode *root) {

	//思想:要求从左到右,下一层从右往左遍历
	//用双端队列,若从左往右,则队尾插入结点,若从右往左,从在队头插入结点   用flag记录遍历方向 ,flag=1从左往后 ,flag=0从右往左

    vector<vector<int> >res;
    
	if (!root)
		return res; //空树
	
	queue<TreeNode*>q_node;//记录每个结点
	q_node.push(root);//根节点入队列
	int flag = 1;//记录遍历方向,若从左往右,则为1

	while (!q_node.empty())
	{
		//使用双端队列记录每层结点
		deque<int> LevelList;
		int size = q_node.size();
		for (int i = 0; i < size; i++)
		{
			auto node = q_node.front();//访问每一个结点
			q_node.pop();//结点出队
			
			if (flag == 1)//正向【从左向右】遍历,在队尾插入元素
			{
				LevelList.push_back(node->val);//队尾插入
			}
			else
			{
				LevelList.push_front(node->val);//队头插入
			}

			//该结点左子树存在,左子树入队列
			if (node->left)
				q_node.push(node->left);//结点入队
			if (node->right)
				q_node.push(node->right);
		}
		flag=!flag;//这里必须这么写,不能写flag=0;[否则后面一直都是0]
		res.push_back(vector<int>{LevelList.begin(), LevelList.end()});
	}
	return res;
}

int main()

{

	TreeNode* root;

	root = inputTree();

	vector<vector<int> > res = zigzagLevelOrder(root);

	for (int i = 0; i < res.size(); i++)

	{

		vector<int> v = res[i];

		for (int j = 0; j < v.size(); j++)

			cout << v[j] << " ";

	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树的层序遍是一种广度优先搜索算法,通过逐层地从左到右访问所有节点,返回节点值的顺序。可以使用队列来实现层序遍。具体思路如下: 1. 创建一个空的结果数组res和一个队列que,将根节点root放入队列que中。 2. 当队列que不为空时,执行以下操作: - 定义一个变量size,用于记录队列que的长度。 - 创建一个空的一维数组vec,用于记录当前层的节点值。 - 遍0到size-1,执行以下操作: - 弹出队列que的头节点cur。 - 将cur的值cur->val添加到一维数组vec中。 - 若cur的左子节点不为空,则将cur的左子节点压入队列que中。 - 若cur的右子节点不为空,则将cur的右子节点压入队列que中。 - 将一维数组vec添加到结果数组res中。 3. 返回结果数组res作为层序遍的结果。 以下是一段C++代码示例,实现了二叉树的层序遍: ``` vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> res; // 结果数组 queue<TreeNode*> que; if (root) que.push(root); while (!que.empty()) { int size = que.size(); // 记录队列的长度 vector<int> vec; for (int i = 0; i < size; i++) { TreeNode* cur = que.front(); que.pop(); vec.push_back(cur->val); if (cur->left) que.push(cur->left); if (cur->right) que.push(cur->right); } res.push_back(vec); } return res; } ``` 这段代码使用了一个队列que,利用队列的先进先出的特点,按照层序遍的顺序将节点添加到结果数组res中。最后返回结果数组res即可得到二叉树的层序遍结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [力扣刷题 | 二叉树](https://download.csdn.net/download/weixin_38633083/13740772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [力扣:102. 二叉树的层序遍](https://blog.csdn.net/qq_46111138/article/details/124895548)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值