劍指offer 32-2:分行從上到下打印二叉樹

用兩個queue來進行打印,一個隊列表示當前正在打印的隊列,另一個隊列記錄正在打印的隊列中節點的子節點,若當前打印的隊列爲空,打印下一層。
在這裏插入圖片描述

/**
*Copyright @ 2019 Zhang Peng. All Right Reserved.
*Filename:
*Author: Zhang Peng
*Date:
*Version:
*Description:
**/

#include<iostream>
#include<stack>
#include<string>
#include<queue>

using namespace std;
struct TreeNode
{
	char val;
	TreeNode * left;
	TreeNode * right;
	TreeNode(char x) :val(x), left(nullptr), right(nullptr){};
};
void CreatTree(TreeNode * & tree, string str, int & index)
{
	//前序遍歷字符串建立樹
	if (index < str.size())
	{
		if (str[index] != '#')
		{
			tree = new TreeNode(str[index]);
			index++;
			CreatTree(tree->left, str, index);
			CreatTree(tree->right, str, index);
		}
		else
		{
			tree = nullptr;
			index++;
			return;
		}
	}
}

void PrintTree(TreeNode * root)
{
	if (root == nullptr)
		return;
	queue<TreeNode *> toprint,next;
	toprint.push(root);
	while (!toprint.empty())
	{
		TreeNode * pnode = toprint.front();
		toprint.pop();

		cout << pnode->val << " ";

		if (pnode->left)
			next.push(pnode->left);

		if (pnode->right)
			next.push(pnode->right);

		if (toprint.empty())
		{
			toprint = next;
			next=queue<TreeNode *>();
			cout << endl;
		}
	}


}

int main()
{
	string str = "abdg####ce##f##";   //用#表示nullptr
	TreeNode * tree;
	int start = 0;
	CreatTree(tree, str, start);

	PrintTree(tree);

	system("pause");
	return 0;
}

在這裏插入圖片描述
如果按之字形打印二叉樹,可將每一層要打印的元素存進vector,再根據奇數還是偶數次打印選擇從前往後還是從後往前的順序。

void PrintTree2(TreeNode * root)
{
	if (root == nullptr)
		return;
	queue<TreeNode *> toprint, next;
	toprint.push(root);
	vector<char> v;
	int num = 0;
	while (!toprint.empty())
	{
		TreeNode * pnode = toprint.front();
		toprint.pop();

		v.push_back(pnode->val);

		if (pnode->left)
			next.push(pnode->left);

		if (pnode->right)
			next.push(pnode->right);

		if (toprint.empty())
		{
			if ((num & 1) == 0)
			{
				for (int i = 0; i < v.size(); i++)
					cout << v[i] << " ";
				cout << endl;
			}
			else
			{
				for (int i = v.size()-1; i>=0; i--)
					cout << v[i] << " ";
				cout << endl;
			}
			v.clear();
			toprint = next;
			next = queue<TreeNode *>();
			num++;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章