树结构的定义,几种遍历方法

1、数据结构中树结构体的定义:

typedef struct BinaryTreeNode
{
	int data;
	struct BinaryTreeNode *lchild;
	struct BinaryTreeNode *rchild;
}* BinTreeRoot;
定义了BinaryTreeNode这个结构体是树中的一个节点。然后又使用typedef将BinaryTreeNode的指针封装为BinTreeRoot类型,相当于是

typedef struct BinaryTreeNode * BinTreeRoot.
2、给定一个指向根节点的指针,树的遍历过程

(1)先序遍历(先根遍历)

递归实现:

void preOrder(BinaryTreeNode *pRoot)
{
	if(pRoot == NULL)
		return;
	else
	{
		cout << pRoot->data << " ";
		preOrder(pRoot->lchild);
		preOrder(pRoot->rchild);
	}
}


借助于栈实现:

void preOrderStack(BinaryTreeNode *pRoot)
{
	if (pRoot == NULL)
		return;
	stack<BinaryTreeNode *>s;
	s.push(pRoot);
	while (!s.empty())
	{
		BinaryTreeNode *temp = s.top();
		s.pop();
		cout << temp->data << " ";
		if (temp->rchild != NULL)
			s.push(temp->rchild);
		if (temp->lchild != NULL)
			s.push(temp->lchild);
	}
}




(2)中序遍历(中根遍历)

递归实现:

void inOrder(BinaryTreeNode *pRoot)
{
	if (pRoot == NULL)
		return;
	else
	{
		inOrder(pRoot->lchild);
		cout << pRoot->data << " ";
		inOrder(pRoot->rchild);
	}
}



借助于栈实现:

void inOrderStack(BinaryTreeNode *pRoot)
{
	if (pRoot == NULL)
		return;
	BinaryTreeNode *p = pRoot;
	stack<BinaryTreeNode *>s;
	s.push(p);//将根节点入栈
	BinaryTreeNode *temp = p->lchild;
	while (temp != NULL)//将这棵树左边的入栈
	{
		s.push(temp);
		temp = temp->lchild;
	}

	while (!s.empty())
	{
		temp = s.top();
		s.pop();
		cout << temp->data << " ";
		if (temp->rchild != NULL)
		{
			temp = temp->rchild;
			while (temp)
			{
				s.push(temp);
				temp = temp->lchild;
			}
		}
	}
}




(3)后序遍历(后根遍历)

递归实现

void postOrder(BinaryTreeNode *pRoot)
{
	if (pRoot == NULL)
		return;
	else
	{
		postOrder(pRoot->lchild);
		postOrder(pRoot->rchild);
		cout << pRoot->data << " ";
	}
}



(4)层次遍历(广度优先遍历)

void herOrder(BinaryTreeNode *root)
{
	if (root == NULL)
		return;
	queue<BinaryTreeNode *>q;
	q.push(root);
	while (!q.empty())
	{
		BinaryTreeNode *temp = q.front();
		q.pop();
		cout << temp->data << " ";
		if (temp->lchild)
			q.push(temp->lchild);
		if (temp->rchild)
			q.push(temp->rchild);

	}
}

把树看做图,相当于图中广度优先遍历。使用队列的先进先出的性质。在图的广度优先遍历中需要设定一个指示节点是否进过队列的bool变量。如果进过队列就置为true,如果没有进过队列为false。

广度优先遍历的思想就是:出对一个元素,将与出对元素相邻并且未进过队列的元素进队这样一个过程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值