二叉树的遍历

建立树结构

typedef struct TreeNode *BinTree;
struct TreeNode{
	int data;
	BinTree left;
	BinTree right;
}; 

一、先序遍历

(1)访问根节点

(2)先序遍历左子树

(3)先序遍历右子树

先序遍历二叉树的递归算法在二叉链表上的实现:

void PreOrderTraversal(BinTree BT)
{
    if(BT)
    {
        cout<<BT->data;
        PreOrderTraversal(BT->left);
        PreOrderTraversal(BT->right);
    }
}

二、中序遍历

(1) 中序遍历左子树;

(2) 访问根结点;

(3) 中序遍历右子树。

中序遍历二叉树的递归算法在二叉链表上的实现:

void InOrderTraversal(BinTree BT)
{
	if(BT)
	{
		InOrderTraversal(BT->left);
		cout<<BT->data;
		InOrderTraversal(BT->right);
	}
}

三、后序遍历

(1) 后序遍历左子树;

(2) 后序遍历右子树;

(3) 访问根结点。

后序遍历二叉树的递归算法在二叉链表上的实现:

void PostOrderTraversal(BinTree BT)
{
	if(BT)
	{
		PostOrderTraversal(BT->left);
		PostOrderTraversal(BT->right);
		cout<<BT->data;
	}	
} 

四、非递归算法(以中序遍历为例)

  1. 遇到一个结点,就把它压栈,并去遍历它的左子树;

  2. 当左子树遍历结束后,从栈顶弹出这个结点并访问它;

  3. 然后按其右指针再去中序遍历该结点的右子树。

中序遍历的非递归算法实现

void InOrder(BinTree BT)
{
	BinTree T=BT;
	stack<BinTree>s;
	while(T||!s.empty())
	{
		while(T)
		{
			s.push(T);
			T=T->left;
		}
		if(!s.empty())
		{
			T=s.top();
			s.pop();
			cout<<T->data;
			T=T->right;
		}
	}
} 

五、层序遍历

设置一个队列结构,遍历从根结点开始,首先将根结点指针入队,然
后开始执行下面三个操作:

1.从队列中取出一个元素;

2.访问该元素所指结点;

3.若该元素所指结点的左、右孩子结点非空,则将其左、右孩子的指针顺序入队。

层序遍历的代码实现

void LevelOrder(BinTree BT)
{
	if(!BT) return;
	BinTree T;
	queue<BinTree>q;
	q.push(BT);
	while(!q.empty())
	{
		T=q.front();
		q.pop();
		cout<<T->data;
		if(T->left) q.push(T->left);
		if(T->right) q.push(T->right);
	}
} 

六、附STL中栈和队列的常用函数

头文件:#include < stack >
创建空栈:stack< int > s;
元素入栈:s.push(x);
元素出栈:s.pop();
取栈顶元素:s.top();
判断非空:s.empty();

队列

头文件:#include< queue >
创建空队列:queue< int > q;
元素入队:q.push(x);
元素出队:q.pop();
取队首元素:q.front();
取队尾元素:q.back();
判断非空:q.empty();

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值