二叉树板块笔记

二叉树头文件“Tree.h”

#pragma once
#include <iostream>
using namespace std;
#define Maxsize 10
template <typename T>
struct Btnode {
	T data;
	Btnode<T>* r, * l;
};
template <typename T>
using Btree = Btnode<T>*;//typedef 在于类模板配合时会比较麻烦,建议用using。

template<typename T>
void visit(Btree<T> N) {
	cout << N->data << endl;

}
template<typename T>
void Settreew(Btree<T> N,int n, int i = 1) {
	if (N) {
		cin >> N->data;
		if (2 * i < n) {
			N->l = new Btnode<int>;
			N->r = new Btnode<int>;
			Settreew(N->l, n, 2 * i);
			Settreew(N->r, n, 2 * i + 1);
		}
		else if (2 * i == n) {
			N->l = new Btnode<int>;
			Settreew(N->l, n, 2 * i);
			N->r = NULL;
		}
		else
			N->l = NULL, N->r = NULL;
	}
}

template<typename Ty>
int Btdepth(Btree<Ty> T)
{
	if (!T)
		return 0;
	int front = -1, rear = -1;//front用于记录数到哪个点,rear用于记录入队到哪个点;
	int last = 0, level = 0;//last 用于记录遍历一层后,该层最右点所储存的位置的序号
	Btnode<Ty>* Q[10];
	Q[++rear] = T;
	Btnode<Ty>* P;
	while (front < rear) {
		P = Q[++front];
		if (P->l)
			Q[++rear] = P->l;
		if (P->r)
			Q[++rear] = P->r;
		if (front == last) {
			level++;
			last = rear;
		}

	}
	return level;
}

用于遍历的栈头文件”Sqstack.h“:

#pragma once
#include <iostream>
using namespace std;
//#define Maxsize 10
#include"Tree.h"

template <typename T>
struct Snode{
	Btnode<T>* p;
	int rvisited;//用于记录是否已经访问过该节点
};

template <typename T>
struct Sqstack {
	/*Snode<T> Elem[Maxsize];*/
	Snode<T>* Elem;//用指针作为成员便于初始化
	int top;
	int Max;
};

template <typename T>
void Initstack(Sqstack<T> &S,int nums) {
	S.Max = nums;
	S.Elem= new Snode<int>[S.Max];
	S.top = -1;
}
template <typename T>
bool Push(Sqstack<T>& S, Snode<T>&x) {
	if (S.top == S.Max - 1)
		return false;
	else {
		S.Elem[++S.top] = x;
		return true;
	}
}
template <typename T>
bool Gettop(Sqstack<T>& S, Snode<T> &x)//要实时返回到x关键节点
{
	if (S.top == -1)
		return false;
	else {
		x = S.Elem[S.top];
		return true;
	}
}
template <typename T>
bool Pop(Sqstack<T>& S, Snode<T> &x)//要实时返回到x关键节点
{
	if (S.top == -1)
		return false;
	else {
		x = S.Elem[S.top--];
		return true;
	}
}
template <typename T>
bool stackempty(Sqstack<T>& S)
{
	if (S.top == -1)
		return true;
	else
		return false;
}
template <typename T>
void visit(Snode<T>N)
{
	visit(N.p);
}


template<typename Ty>
void Postorder2(Btree<Ty> T) {//后序非递归遍历
	Snode<Ty>sn;//用于赋值
	Snode<Ty> *st;//用于获取实时状态的指针
	Btree<Ty> P = T;
	Sqstack<int> S;
	Initstack(S,10);
	while (P) {
		sn.p = P;
		sn.rvisited = 0;
		Push(S, sn);
		P = P->l;
	}

	while (!stackempty(S)) {
		//Gettop(S, sn);//该函数仅仅是赋值而已!!!!
		st = &S.Elem[S.top];
		if (st->p->r == NULL || st->rvisited) {
			Pop(S, sn);
			visit(sn);
		}
		else {
			st->rvisited = 1;
			P = st->p->r;
			while (P) {
				sn.p = P;
				sn.rvisited = 0;
				Push(S, sn);
				P = P->l;
			}
		}
	}
}

主文件

#include<iostream>
using namespace std;
#include"Sqstack.h"



int main()
{
	Btnode<int> T;
	Btree<int> P = &T;
	Settreew(&T, 6, 1);
	int Y = Btdepth(&T);
	cout << "Depth=" << Y<<endl;

	Postorder2(&T);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值