数据结构-二叉树

h

#pragma once
#include "pch.h"
namespace tree {
 class treelist {
 public:
	 void douinit(treelist *&);//需要用二级指针 ,因为树是用形参的一级指针new  要用二级指针来保证new不被释放
	 void douwatchp(treelist *);//先序遍历
	 void douwatchc(treelist *);//中序
	 void douwatchb(treelist *);//后序
	 void douleaf(treelist *);//先序输出叶子节点
	 int  douleafcount(treelist *);//分治统计叶子数目
	 void higp(treelist *, int);//先序递归树的深度
	 void douinitthread(treelist *);//创建线索树
	 treelist *doucthreadp(treelist *);//中序线索树前驱
	 treelist *doucthreadb(treelist *);//中序线索树后驱
	 treelist *doucthreadp1(treelist *);//中序线索树第一个节点
	 treelist *douthreadcount(treelist *);//中序线索树遍历

 private:
		char data;
		treelist *ld;
		treelist *rd;
		int lcount = 0;//叶子数目
		int ldtag=0;//左驱
		int rdtag=0;//右驱
	};
}

cpp

#include "pch.h"
#include "树.h"
extern int hig;
tree::treelist *pre;
using namespace tree;
void tree::treelist::douinit(treelist *&l)
{
	char x; x = getchar();
	if (x == ' ')
	{
		l = NULL;
	}
	else {
		l = new treelist;
		l->data = x;
		douinit(l->ld);
		douinit(l->rd);
	}
};
void   treelist::douwatchp(treelist* l)
{
	if (l)
	{
		cout << l->data;
		douwatchp(l->ld);
		douwatchp(l->rd);
	}
};
void   treelist::douwatchc(treelist* l)
{
	if (l)
	{
		douwatchp(l->ld);
		cout << l->data << endl;
		douwatchp(l->rd);
	}
};
void   treelist::douwatchb(treelist* l)
{
	if (l)
	{
		douwatchp(l->ld);
		douwatchp(l->rd);
		cout << l->data << endl;
	}
};
void   treelist::douleaf(treelist* l)
{
	if (l)
	{
		if (l->ld == NULL && l->rd == NULL)
		{
			cout <<"节点是:"<< l->data << endl;
		}
		douwatchp(l->ld);
		douwatchp(l->rd);
	}
};
int treelist::douleafcount(treelist* l)
{
	if (l == NULL)
		l->lcount = 0;
	else if (l->ld == NULL && l->rd == NULL)
		l->lcount++;
	else
		l->lcount = douleafcount(l->ld) + douleafcount(l->rd);//对楼上的递归
	cout<< "叶节点总数是"<<l->lcount << endl;
	return l->lcount;
};
void treelist::higp(treelist*l, int h)//h是当前层
{
	if(l)
	{
		if (hig < h)
		{
			hig = h;
			higp(l->ld, h + 1);
			higp(l->rd, h + 1);
		}
    }
	cout<<"树的高度是"<<endl;
};
void  treelist::douinitthread(treelist *l)//0是孩子 1是前/后驱
{
	if (l)
	{
		douinitthread(l->ld);//1 左遍历
		if (l->ld = NULL)// 2左遍历完
		{
			l->ldtag = 1; l->ld = pre;// 3回到上个节点 如果右节点空跳4,否则6
		}
		if (pre->rd = NULL)//4
		{
			pre->rdtag = 1; pre->rd = l;//5右空指向上节点
		}
		pre = l;// 6继续往下访问
		douinitthread(l->rd);//右遍历继续 
	}
};
treelist *  treelist::doucthreadp(treelist *l)
{
	treelist *p;
	p = l->ld;
	if (l->ldtag!= 1)//左子不是前驱
	{
		while (p->rdtag == 0)//找第一个没有右子的节点
			p = p->rd;
	}
	return p;
};
treelist * treelist::doucthreadb(treelist *l)
{
	treelist *p;
	p = l->rd;
	if (l->rdtag != 1)
	{
		while (p->ldtag == 0)
			p = p->ld;
	}
	return p;
};
treelist * treelist::doucthreadp1(treelist *l)
{
	treelist *p=l;
	if (!p) return NULL;
	while (p->ldtag == 0)
		p = p->ld;
	return p;
};
treelist * treelist::douthreadcount(treelist *l)
{
	treelist *p = doucthreadp1(l);
	while (p)
	{
		cout << p->data;
		p = doucthreadb(p);
	}
	return p;
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值