二叉树的遍历:先序、中序、后序

本文详细介绍了使用C++实现二叉树的先序、中序、后序遍历以及层次遍历的方法,通过递归和非递归两种方式展示,并通过实例演示了如何构建和遍历二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:源码来自作者:http://my.youkuaiyun.com/monsion 转载请联系作者!!!

main.cpp

#include "binaryTree.h"

using namespace std;

int main()
{
//	int a[]={8,6,10,5,7,9,11};
	//以-1标示空节点
	int a[]={8,8,7,9,2,-1,-1,-1,-1,4,7};
	binaryTree test;
	binaryTreeNode * root;
	root = test.initBTree(a,0,11);
//	test.preOrderTraverse(root);//递归版本
	test.preOrderTraverse(root,true);//非递归版本
	cout << "===========" << endl;
//	test.inOrderTraverse(root);//递归版本
	test.inOrderTraverse(root,true);//非递归版本
	cout << "===========" << endl;
//	test.postOrderTraverse(root);//递归版本
	test.postOrderTraverse(root,true);//非递归版本
	cout << "===========" << endl;
	test.levelOrderTraverse(root);
	return 0;
}

binaryTree.h

#ifndef BINARY_TREE_H_H_H___
#define BINARY_TREE_H_H_H___

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

using namespace std;

struct binaryTreeNode
{
	int value;
	binaryTreeNode *pLeft;
	binaryTreeNode *pRight;
};

class binaryTree
{
public:
	binaryTreeNode * initBTree(int a[],int i,int n);
	//以下三个函数为递归版本
	void preOrderTraverse(binaryTreeNode * root);
	void inOrderTraverse(binaryTreeNode * root);
	void postOrderTraverse(binaryTreeNode * root);
	//以下三个版本为非递归版本,第二个参数为重载用,无意义
	void preOrderTraverse(binaryTreeNode * root,bool type);
	void inOrderTraverse(binaryTreeNode * root,bool type);
	void postOrderTraverse(binaryTreeNode * root,bool type);
	//层次遍历
	void levelOrderTraverse(binaryTreeNode * root);
};

#endif

binaryTree.cpp

#include "binaryTree.h"

using namespace std;
//初始化二叉树
binaryTreeNode * binaryTree::initBTree(int a[],int i,int n)
{
	//以-1标示空节点
	if (i>=n || a[i]==-1)
		return NULL;
	binaryTreeNode * root = new binaryTreeNode();
	root->value = a[i];
	root->pLeft = initBTree(a,2*i+1,n);
	root->pRight = initBTree(a,2*i+2,n);
	return root;
}

//先序遍历,递归版本
void binaryTree::preOrderTraverse(binaryTreeNode * root)
{
	if (root==NULL)
		return ;
	cout << root->value << endl;
	preOrderTraverse(root->pLeft);
	preOrderTraverse(root->pRight);
}

//先序遍历,非递归版本
void binaryTree::preOrderTraverse(binaryTreeNode * root,bool type)
{
	if (root==NULL)
		return ;
	stack<binaryTreeNode *> treeStack;
	treeStack.push(root);
	while(!treeStack.empty())
	{
		binaryTreeNode * node = treeStack.top();
		treeStack.pop();
		cout << node->value << endl;
		if (node->pRight!=NULL)
			treeStack.push(node->pRight);
		if (node->pLeft!=NULL)
			treeStack.push(node->pLeft);
	}
}

//中序遍历,递归版本
void binaryTree::inOrderTraverse(binaryTreeNode *root)
{
	if (root==NULL)
		return ;
	if(root->pLeft!=NULL)
	{
		inOrderTraverse(root->pLeft);
	}
	cout << root->value << endl;
	if(root->pRight!=NULL)
	{
		inOrderTraverse(root->pRight);
	}
}

//中序遍历,非递归版本
void binaryTree::inOrderTraverse(binaryTreeNode * root,bool type)
{
	if (root==NULL)
		return ;
	stack<binaryTreeNode *> treeStack;
	treeStack.push(root);
	binaryTreeNode * node = root;
	while(!treeStack.empty())
	{
		while(node->pLeft!=NULL)
		{
			treeStack.push(node->pLeft);
			node = node->pLeft;
		}
		node=treeStack.top();
		treeStack.pop();
		cout << node->value << endl;
		if(node->pRight!=NULL)
		{
			treeStack.push(node->pRight);
			node = node->pRight;
		}
	}
}

//后序遍历,递归版本
void binaryTree::postOrderTraverse(binaryTreeNode *root)
{
	if (root==NULL)
		return ;
	if(root->pLeft!=NULL)
	{
		postOrderTraverse(root->pLeft);
	}
	if(root->pRight!=NULL)
	{
		postOrderTraverse(root->pRight);
	}
	cout << root->value << endl;
}

//后序遍历,非递归版本
void binaryTree::postOrderTraverse(binaryTreeNode * root,bool type)
{
	if (root==NULL)
		return;
	stack<binaryTreeNode *> treeStack;
	stack<binaryTreeNode *> output;
	treeStack.push(root);	
	binaryTreeNode *node = NULL;
	while(!treeStack.empty())
	{
		node=treeStack.top();
		treeStack.pop();
		output.push(node);
		if(node->pLeft)
			treeStack.push(node->pLeft);
		if(node->pRight)
			treeStack.push(node->pRight);
	}
	while(!output.empty())
	{
		node = output.top();
		output.pop();
		cout << node->value  << endl;
	}
}

//层次遍历
void binaryTree::levelOrderTraverse(binaryTreeNode *root)
{
	if(root==NULL)
		return;
	queue<binaryTreeNode *> treeQueue;
	treeQueue.push(root);
	binaryTreeNode * node;
	while(!treeQueue.empty())
	{
		node = treeQueue.front();
		treeQueue.pop();
		cout << node->value << endl;
		if (node->pLeft)
			treeQueue.push(node->pLeft);
		if (node->pRight)
			treeQueue.push(node->pRight);
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值