问题描述
试给出算法求二叉树的直径(高度、最大层次数)以及长度等于直径的一条路径(从根到叶子的节点序列)
二叉树的直径:树中的两个叶子节点之间最长路径的节点的数目
reference
思路
先举几个例子来找一找规律。
最大路径可能
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 |
*/