完全二叉树的性质与遍历

完全二叉树的性质

完全二叉树在满二叉树中,从最后一个结点开始,连续去掉任意个结点得到的二叉树。

性质1:对一棵具有 n 结点的完全二叉树从 1 开始按层序编号,对于任意的序号i(1in的结点(简称结点 i),有:

(1)如果 i>1,结点 i 双亲结点的序号为 i/2,否则结点 i 双亲结点

2如果 2in结点 i 左孩子的序号2i,否则结点 i 孩子

3如果 2i+1≤n结点 i 右孩子的序号为2i+1,否则结点 i 孩子

通过性质1,我们可以得到寻找根节点的左子树和右子树的方法,进而创建递归算法。

完全二叉树的存储

 

采用顺序结构即按层序编号的顺序存储所有结点,例如采用一维数组data[MaxSize]存储上图的完全二叉树,用data[0]来存储结点数,data[1]即为根节点。

        显然,按图数组顺序存储方式,将下标为0的单元存放结点数,那么各结点所在的下标与层序编号一致。在二叉链表的递归中序遍历算法的基础上,用结点下标代替结点的地址,即可实现顺序存储的递归中序遍历

 

代码如下:

void AbsBiTree::seqInOrder(int i) {
	if (i == 0) {//递归的结束条件
		return;
	}
	else {
		if (2 * i <= data[0]) {
			//遍历左子树
			seqInOrder(2 * i);
		}
		else {
			seqInOrder(0);
		}
		//访问根节点
		cout << data[i] << ' ';
		
		if (2 * i + 1 <= data[0]) {
			//遍历右子树
			seqInOrder(2 * i + 1);
		}
		else {
			seqInOrder(0);
		}
	}
}

完整代码:

包含三种遍历

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
const int MaxSize = 100;

class AbsBiTree
{
public:
	AbsBiTree() {

	}
	AbsBiTree(char a[], int n);
	~AbsBiTree() {

	}
	void seqInOrder() {
		cout << "完全二叉树中序遍历为:";
		seqInOrder(1);
		cout << endl;
	}
	void seqPreOrder() {
		cout << "完全二叉树前序遍历为:";
		seqPreOrder(1);
		cout << endl;
	}
	void seqPostOrder() {
		cout << "完全二叉树后序遍历为:";
		seqPostOrder(1);
		cout << endl;
	}
	void seqInOrder(int i);
	void seqPreOrder(int i);
	void seqPostOrder(int i);
private:
	char data[MaxSize];
	
};

//传入按层序排序的完全二叉树
AbsBiTree::AbsBiTree(char a[],int n)
{
	if (n + 1 > MaxSize) {
		cout << "二叉树超载" << endl;
		exit(0);
	}
	data[0] = n;
	for (int i = 0; i < n; i++) {
		data[i+1] = a[i];
		
	}
}

void AbsBiTree::seqInOrder(int i) {
	if (i == 0) {//递归的结束条件
		return;
	}
	else {
		if (2 * i <= data[0]) {
			//遍历左子树
			seqInOrder(2 * i);
		}
		else {
			seqInOrder(0);
		}
		//访问根节点
		cout << data[i] << ' ';
		
		if (2 * i + 1 <= data[0]) {
			//遍历右子树
			seqInOrder(2 * i + 1);
		}
		else {
			seqInOrder(0);
		}
	}
}

void AbsBiTree::seqPreOrder(int i) {
	if (i == 0) {
		return;
	}
	else {
		cout << data[i] << ' ';
		if (2 * i <= data[0]) {
			seqPreOrder(2 * i);
		}
		else {
			seqPreOrder(0);
		}
		
		if (2 * i + 1 <= data[0]) {
			seqPreOrder(2 * i + 1);
		}
		else {
			seqPreOrder(0);
		}
	}
}

void AbsBiTree::seqPostOrder(int i) {
	if (i == 0) {
		return;
	}
	else {
		if (2 * i <= data[0]) {
			seqPostOrder(2 * i);
		}
		else {
			seqPostOrder(0);
		}
		if (2 * i + 1 <= data[0]) {
			seqPostOrder(2 * i + 1);
		}
		else {
			seqPostOrder(0);
		}
		cout << data[i] << ' ';
	}
}

void test();
void test() {
	char a[] = { 'A','B','C','D','E','F','G','H','I','J' };
	AbsBiTree bi(a, sizeof(a) / sizeof(char));
	cout << sizeof(a) / sizeof(char) << endl;
	bi.seqInOrder();
	bi.seqPreOrder();
	bi.seqPostOrder();
}

int main() {
	test();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值