剑指offer 23----二叉树的前序、中序、后序、层序遍历

二叉树的前序、中序、后序、层序遍历

#include <iostream>
#include <Windows.h>
#include <queue>
using namespace std;

template<class T>
struct BinaryTreeNode      //构建二叉树的节点,及左右子树的指针
{
	T _data;   //值
	BinaryTreeNode<T>* _left;   //左子树
	BinaryTreeNode<T>* _right;   //右子树
	BinaryTreeNode(const T& data)      //构造
		:_data(data)
		, _left(NULL)
		, _right(NULL)
	{}
};

template<class T>
class BinaryTree     //实现二叉树
{
	typedef BinaryTreeNode<T> Node;   //节点
protected:
	Node* _root;     //指向根节点的指针,里面保存根节点
	Node* CreateTree(T* a, size_t n, const T& invalid, size_t& index)    //递归
	{
		Node* root = NULL;
		if (index < n && a[index] != invalid)  //a不为非法值
		{
			//先序遍历建树
			root = new Node(a[index]);  //根
			root->_left = CreateTree(a, n, invalid, ++index);   //左
			root->_right = CreateTree(a, n, invalid, ++index);  //右
		}
		return root;
	}

	void _PreOrder(Node* root)     //前序实现   根 左 右
	{
		if (root == NULL)
		{
			return;
		}
		cout << root->_data << " ";
		_PreOrder(root->_left);
		_PreOrder(root->_right);
	}

	void _InOrder(Node* root)    //中序实现    左  根  右
	{
		if (root == NULL)
		{
			return;
		}
		_InOrder(root->_left);
		cout << root->_data << " ";
		_InOrder(root->_right);
	}

	void _PostOrder(Node* root)      //后序实现    左  右  根
	{
		if (root == NULL)
		{
			return;
		}
		_PostOrder(root->_left);
		_PostOrder(root->_right);
		cout << root->_data << " ";
	}

	void _LevelOrder(Node* root)    //层序     利用队列的特性依次遍历
	{
		if (root == NULL)
		{
			return;
		}
		queue<Node*> tty;
		tty.push(root);
		while (!tty.empty())
		{
			if (tty.front()->_left != NULL)
			{
				tty.push(tty.front()->_left);
			}
			if (tty.front()->_right != NULL)
			{
				tty.push(tty.front()->_right);
			}
			cout << tty.front()->_data << " ";
			tty.pop();
		}
		cout << endl;
	}

public:
	BinaryTree()
		:_root(NULL)
	{}

	BinaryTree(T* a, size_t n, const T& invalid = T())    //构建二叉树,数组存放
	{
		size_t index = 0;
		_root = CreateTree(a, n, invalid, index);
	}

	void PreOrder()    //前序
	{
		_PreOrder(_root);
	}

	void InOrder()     //中序
	{
		_InOrder(_root);
	}

	void PostOrder()      //后序
	{
		_PostOrder(_root);
	}

	void LevelOrder()     //层序
	{
		_LevelOrder(_root);
	}
};

#include "tree.h"
void test()
{
	int array[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6 };
	BinaryTree<int> p(array, sizeof(array) / sizeof(array[0]), '#');
	//构建二叉树时是用前序建的树
	cout << "前序: " << "";
	p.PreOrder();
	cout << endl;
	cout << "中序: " << "";
	p.InOrder();
	cout << endl;
	cout << "后序: " << "";
	p.PostOrder();
	cout << endl;
	cout << "层序: " << "";
	p.LevelOrder();
}

int main()
{
	test();
	system("pause");
	return 0;
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值