《剑指offer》:[61]按之字形顺序打印二叉树

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

例如:按之字形顺序打印二叉树的结果如下图:

打印结果:

1

3,2

4,5,6,7

15,14,13,12,11,10,9,8

方案:利用两个栈。时间复杂度O(N)+辅助空间2*O(N)。

具体方法:我们在打印某一结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层(例如第一层,第三层...第2*n+1层),则先保存左子结点再保存右子结点到栈里;如果当前打印的是偶数层(2*n),则先保存右子结点再保存左子结点。具体分析步骤如下:

具体实现代码:

#include <iostream>
#include <stack>
using namespace  std;
struct BinaryTree
{
	int data;
	BinaryTree *pLeft;
	BinaryTree *pRight;
};
BinaryTree *pRoot=NULL;
void CreateTree(BinaryTree *&root)
{
	int data;
	cin>>data;
	if(0==data)
		root=NULL;
	else
	{
		root =new BinaryTree;
		root->data=data;
		CreateTree(root->pLeft);
		CreateTree(root->pRight);
	}
}
void PrintZhi(BinaryTree *root)
{
	if(NULL==root)
		return;
	stack<BinaryTree*> level[2];
	int current=0;
	int next=1;
	level[current].push(root);
	while(!level[0].empty() || !level[1].empty())
	{
		BinaryTree *node=level[current].top();
		level[current].pop();
		cout<<node->data<<" ";
		if(current==0)
		{
			if(node->pLeft!=NULL)//从左端开始入栈;
				level[next].push(node->pLeft);
			if(node->pRight!=NULL)
				level[next].push(node->pRight);
		}
		else
		{
			if(node->pRight!=NULL)
				level[next].push(node->pRight);
			if(node->pLeft!=NULL)
				level[next].push(node->pLeft);
		}
		if(level[current].empty())
		{
			cout<<endl;
			current=1-current;
			next=1-next;
		}
	}
}
void PreOrder(BinaryTree *root)
{
	if(root)
	{
		cout<<root->data<<" ";
		PreOrder(root->pLeft);
		PreOrder(root->pRight);
	}
}
int main()
{
	CreateTree(pRoot);
	cout<<"前序遍历:";
	PreOrder(pRoot);
	cout<<endl;
	cout<<"之字形打印结果如下:"<<endl;
	PrintZhi(pRoot);
	system("pause");
	return 0;
}

运行结果:

时间: 2024-12-12 15:35:50

《剑指offer》:[61]按之字形顺序打印二叉树的相关文章

剑指offer:按之字形顺序打印二叉树

题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: """ 由于需要打印Z字型,那么我们在遍历整棵树的时候就需要维护一个栈. 栈中存储的是下一层的节点的逆序,则在访问的时候

剑指OFFER之从上往下打印二叉树(九度OJ1523)

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行一个整数n(1<=n<=1000, :n代表将要输入的二叉树元素的个数(节点从1开始编号).接下来一行有n个数字,代表第i个二叉树节点的元素的值.接下来有n行,每行有一个字母Ci.Ci='d'表示第i个节点有两子孩子,紧接着是左孩子编号和右孩子编号.Ci='l'表示第i个节点有一个左孩子,紧接着是左孩子的编号.Ci='r'表示第i个节点有一个右孩

【Java】 剑指offer(31)从上往下打印二叉树

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 (一)从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印. (二)从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行. (三)请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 思路 (一)不分行从上往下打印二叉树:该题即为对二叉树的层

剑指offer:从上到下打印二叉树

题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: """ 由于需要逐层打印,那么我们在遍历整棵树的时候就需要维护一个队列. 队列中存储的是下一层从左到右的节点. 具体来说在打印第k层的节点的时候,将该节点的左右子节点按顺序入队即可.递归出口就是队列为空 &qu

[剑指Offer] 22.从上往下打印二叉树

[思路]广度优先遍历,队列实现 1 class Solution 2 { 3 public: 4 vector<int> PrintFromTopToBottom(TreeNode* root) 5 { 6 queue<TreeNode*> Queue; 7 vector<int> res; 8 if(root == NULL) 9 return res; 10 Queue.push(root); 11 while(!Queue.empty()) 12 { 13 res

剑指offer:从上往下打印二叉树

题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路: 实际就是二叉树的中序遍历问题.之前在leetcode刷过类似题目. 利用队列完成即可. 代码: /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: v

剑指offer——32从上到下打印二叉树

题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 题解: 就是简单的层序遍历 1 class Solution { 2 public: 3 vector<int> PrintFromTopToBottom(TreeNode* root) { 4 vector<int>res; 5 BFS(root, res); 6 return res; 7 } 8 void BFS(TreeNode *root, vector<int>&res) 9 { 10

按之字形顺序打印二叉树-剑指Offer

按之字形顺序打印二叉树 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 思路 根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空 代码 import java.util.ArrayList; import java.util.St

按之字形顺序打印二叉树(剑指offer+队栈的应用)

按之字形顺序打印二叉树 参与人数:703时间限制:1秒空间限制:32768K 通过比例:25.31% 最佳记录:0 ms|8552K(  ) 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 题意:看测试用例 测试用例: {8,6,10,5,7,9,11} 对应输出应该为: [[8],[10,6],[5,7,9,11]] 思路:用一个布尔量控制从左到右还是从右到左的顺序:先放入栈中,然后把他