数据结构与算法二叉树模板类的实现(递归非递归遍历)

二叉树节点和二叉树类的定义如下

#include<iostream>
using namespace std;
const int Maxsize = 100;
template<class T>
struct BiNode {
	T data;
	BiNode<T>*rch;
	BiNode<T>*lch;
};
template<class T>
class Bitree {
private:
	void Create(BiNode<T>*&R, T data[], int n);
	void Release(BiNode<T>*R);
public:
	BiNode<T>*Root;
	Bitree(T data[]) { Create(Root, data, 1); }
	~Bitree() { Release(Root); }
};

用递归的方式来生成和销毁二叉树类

template<class T>void Bitree<T>::Create(BiNode<T>*&R, T data[], int i) {
	if (data[i - 1] != 0) {//如果元素不为零,则执行
		R = new BiNode<T>;//为节点申请动态内存
		R->data = data[i - 1];
		R->lch = R->rch = NULL;
		Create(R->lch, data, 2 * i);//递归遍历
		Create(R->rch, data, 2 * i + 1);
	}
}
template<class T>void Bitree<T>::Release(BiNode<T>*R) {
	if (!R) {
		Release(R->lch);
		Release(R->rch);
		delete R;
	}
}

用递归的方式进行遍历由于前序和中序,后序遍历的算法一样,只需要改变一下位置即可,以前序遍历为例。

template<class T>void PreOrder(BiNode<T>*&R)
{
	if (R) {
		cout << R->data ;
		PreOrder(R->lch);
		PreOrder(R->rch);
	}
	cout << 0;
}

用非递归的方式实现各种遍历方式
前序遍历:
用栈的先进后出的思想来实现
1.定义一个存放节点的数组(栈),并将根节点入栈,在栈顶。
2.然后栈顶出栈,在出栈的同时,其左右孩子入栈,由于先进后出的思想,先让右孩子进栈。
3.若栈不为空,则一直进行2
代码

template<class T>void PreOrder(BiNode<T>*R) {
	BiNode<T>*stack[Maxsize];
	int top = -1;
	BiNode<T>*p;
	if (R != NULL)
	{
		stack[++top] = R;
		while (top != -1) {
			p = stack[top--];
			cout << p->data<<'	';
			if (p->rch != NULL)stack[++top] = p->rch;
			if (p->lch != NULL)stack[++top] = p->lch;
		}
	}
}

中序遍历:
1.定义一个栈和一个工作指针,根节点入栈,工作指针指向根节点。
2.进入当栈非空或工作节点不为NULL时,开始循环。
2.1工作指针的左孩子,左孩子的左孩子依次进栈,直到没有左孩子的节点。
2.2访问并将该节点出栈,并将工作节点指向右孩子节点。
2.3下一次循环:判断是否有右孩子节点及右孩子节点是否有孩子节点,若不存在右孩子节点,则返回到上一节点。继续循环。

template<class T>void InOrder(BiNode<T>*R) {
	BiNode<T>*stack[Maxsize];
	int top = -1;
	BiNode<T>*p=R;
	cout << "中序遍历";
	while (top != -1 || p != NULL) {
		while (p) {
			stack[++top] = p;
			p = p->lch;
		}
		if (top != -1) {
			p = stack[top--];
			cout << p->data<<'	';
			p = p->rch;
		}
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值