森林链式储存方式求高度(递归,层次)

森林链式储存方式求高度(递归,层次)

1. 头文件

#include<iostream>
#include<queue>

2.节点

struct node {
	char data;
	node *lkid;
	node *rbro;
};

在结点中我们要设立这个节点的 data 值,他的第一个左孩子,他的兄弟

3.构造二叉树
森林的一种变形也就是一种特殊的二叉树,用孩子—兄弟方式来创造
我们采用递归的方式来构造二叉树

void createtree(node*&t) 
{
	char ch;
	cin>>ch;
	
	if(ch=='#')
	t=NULL;
	else
	{
		t=new node;
		t->data=ch;
		createtree(t->lkid);
		createtree(t->rbro);
	}
}

4.遍历求高度

int high(node *t)
{
	if(t==NULL) return 0;
	else 
	{
		int a, b;
		a = high(t->lkid)+1;
		b = high(t->rbro);   
		return max(a, b); //依次比较右子树所有结点高度 取最高的即可
	}
}

在森林转为二叉树的逻辑中,新的二叉树中,只要结点有左孩子,就要给他的层次 +1
但右兄弟就不用,不过还是要遍历右兄弟,因为右兄弟的后继结点中可能也有左孩子

5.层次遍历求深度

int dep(node * root)
	{
		queue<node*> Queue;
		Queue.push(root);
		int height = 0;               //层次遍历高度 
		while (Queue.size() != 0)     //入队的是每个根节点的左孩子,在森林中就是他的下一级 
		{                        
			int len = Queue.size();   //左孩子的个数决定他的循环次数 因为每找到一个左孩子 就要看看这个左孩子还有没有左孩子 
			node* n;
			for (int i = 1; i <= len; i++)
			{
				n = Queue.front();     //提取根节点  n用来遍历结点
				Queue.pop();
				while (n != NULL)    
				{
					if (n->lkid != NULL) Queue.push(n->lkid);    //有左孩子就入队 
					n = n->rbro;                                  
				}
			}
			height++;
		}
		return height;
	}

层次遍历要用到队列,队列里面储存的是有左孩子的结点,只要遍历时发现有这样的节点,就入队。
之后再遍历他的右兄弟。
一次循环后层次 +1

6.主函数

int main()
{
	node *t;
	createtree(t);
	cout<<"森林链式递归遍历求高度"<<endl; 
	cout<<high(t)<<endl;
	cout<<"森林链式层次遍历求高度"<<endl; 
	cout<<dep(t);	
}

7.输出结果

ABEK##F##CG##DH#I#J###L#MN###
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值