数据结构小作业——求二叉树直径以及直径等于长度的一条路径

问题描述

试给出算法求二叉树的直径(高度、最大层次数)以及长度等于直径的一条路径(从根到叶子的节点序列)
二叉树的直径:树中的两个叶子节点之间最长路径的节点的数目

reference

link

思路

先举几个例子来找一找规律。
最大路径可能

1.经过根节点——>计算:左子树深度+右子树深度+1
2.不经过根节点——>计算:是左子树或者右子树的最大路径(分治法计算)

所以,二叉树直径=max(左子树直径,右子树直径,左子树深度+右子树深度+1)
#######################################################
啊啊啊啊这里老师写错了吧,老师想说高度但是说成了直径好烦呐!!!!
思路转变。
求最大层次数,即为二叉树高度。这样的话,可以把层次带到函数中来,然后去做。当然结果数组也要带到函数中去。同时也要把到目前为止找到的最大层次数先存储起来,带到函数中去。所以函数头中应该有最大路径数组当前路径数组当前最大层次数当前层次数当前结点
那么思路就是,遍历二叉树直到叶子节点,然后看看是不是比原来的长,若比原来的长,则更新result数组和max

code

找到最长路径

int find(nodePtr a, int &max, int k, char tem[], char result[])
{
	if(a == NULL)
	{
		if(k - 1 > max)
		{
			max = k - 1;
			tem[k] = 0;
			copy(result, tem);//复制数组 
			return k;
		}
	}
	else
	{
		tem[k] = a->ch;
		k++;
		find(a->left, max, k, tem, result);
		find(a->right, max, k, tem, result);
	}
}

#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct node{
	char ch;
	struct node *left;
	struct node *right;
}node, *nodePtr;
nodePtr create();//创建一棵二叉树 
void destroy(nodePtr a);//删除二叉树 
int find(nodePtr a, int &max, int k, char tem[], char result[]);//找到二叉树中最长路径 并将其存储在result数组中 
void print(int k, char result[]);//打印结果数组 
void copy(char result[], char tem[]);//将tem中的值复制到result中 
int main()
{
	char result[100];//结果数组
	char tem[100];
	result[0] = 0;
	nodePtr a = create();//建立二叉树 
	int max = 1, k;
	k = find(a, max, 1, tem, result);//找到高度和最长路径
	cout<<"k = "<<k<<endl;
	print(k, result);//打印结果数组
	return 0;    
}
nodePtr create()
{
	char ch;
	nodePtr a;
	scanf("%c",&ch);
	if(ch == ' ')
	{
		return NULL;
	}
	else
	{
		a = new node;
		a->ch = ch;
		a->left = create();
		a->right = create();
		return a;
	}
}
void destroy(nodePtr a)
{
	if(a == NULL)
	{
		return;
	}
	else
	{
		destroy(a->left);
		destroy(a->right);
		delete a;
	}
}
int find(nodePtr a, int &max, int k, char tem[], char result[])
{
	if(a == NULL)
	{
		if(k - 1 > max)
		{
			max = k - 1;
			tem[k] = 0;
			copy(result, tem);//复制数组 
			return k;
		}
	}
	else
	{
		tem[k] = a->ch;
		k++;
		find(a->left, max, k, tem, result);
		find(a->right, max, k, tem, result);
	}
}
void print(int k, char result[])
{
	int i;
	for(i = 1; i <= k; i++)
	{
		cout<<result[i]<<" ";
	}
	cout<<endl;
}
void copy(char result[], char tem[])
{
	int i = 1;
	while(tem[i])
	{
		result[i] = tem[i];
		i++;
	}
	result[i] = 0;
}
/*
1.ABDH   EI   CF  GJ   |
2.AB  CD   |
*/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一、二叉树(二) 1. 写算法 (1)二叉树直径定义为从根结点至叶子的最大路径长度。编写算法,二叉树(二叉链表)的直径。 (2)已知二叉树(二叉链表)根结点指针bt,树中两个结点的指针p、q。编写算法距离结点*p和*q最近的公共祖先的地址。 (3)已知二叉树(二叉链表)根结点指针bt,利用二叉树叶子结点的rchild指针域将所有叶子结点从左向右连接成一个单向链表。算法返回单向链表头结点指针(即最左边第1个叶子结点的地址)。 2. 编程题 (1) 从键盘输入一个字符串(要字符串中无重复字符),将串中字符当做完全二叉树的顺序存储结构,建立对应的完全二叉树的二叉链表存储结构,输出先、中、后序遍历结果。 (2) 用先序遍历法建立二叉树二叉链表存储结构(结点数据域类型为char,输入字符序列用字符'#'表示NULL),实现中序线索化,并用非递归算法输出中序遍历结果的正序和逆序序列。 二、图 1. 已知某无向图如下图所示。画出该图的多重邻接表存储结构示意图。根据该存储结构,写出从顶点v0出发,深度和宽度优先遍历顶点访问次序。 2.写一个算法,判断无向图是否有环。算法提要:深度优先遍历过程中,访问某顶点后,该顶点的邻接点中有已访问的顶点且该已访问邻接点不是该顶点的上一级递归出发顶点(即存在回边),则有环。 3.编程题: 建立无向图邻接表存储结构,输出深度和宽度优先遍历顶点访问次序。 4.编程题:建立AOE网络存储结构,计算并输出ve[]和vl[]。 5.选作题*:算法设计-已知AOE网络的邻接表存储结构G,ve[]和vl[]值已全部取,写出算法,输出所有关键路径。要每条关键路径用源点至汇点的顶点序列(拓扑有序)表示。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值