题目描述:
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。
写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。
思路:
最大距离要么等于左子树的最大距离,要么等于右子树的距离,要么等于左子树的高度+右子树的高度,取三者中的最大值。
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin;
struct Node
{
char data;
Node *left;
Node *right;
};
void preorder_create(Node **root);
void create_btree(Node **root)
{
preorder_create(root);
}
//先序方式建立二叉树,输入‘#’表示当前子树结束
void preorder_create(Node **root)
{
char dt;
fin>>dt;
if(dt == '#')
return;
if(!(*root))
{
*root = new Node;
(*root)->left = NULL;
(*root)->right = NULL;
(*root)->data = dt;
}
preorder_create(&((*root)->left));
preorder_create(&((*root)->right));
}
/*void preorder_create(Node* &root)
{
char dt;
fin>>dt;
if(dt == '#')
return;
if(!root)
{
root = new Node;
root->left = NULL;
root->right = NULL;
root->data = dt;
}
preorder_create(root->left);
preorder_create(root->right);
}*/
//先序遍历二叉树
void preorder_visit(Node *root)
{
if(NULL != root)
{
cout<<root->data<<' ';
preorder_visit(root->left);
preorder_visit(root->right);
}
}
//dept用于记录当前节点的高度,且根节点最高,叶子节点最低为1
int width(Node *root, int &dept)
{
if(NULL == root)
{
dept = 0;
return 0;
}
int ld = 0, rd = 0;
//递归,maxl和maxr分别表示左子树和右子树的最大距离
int maxl = width(root->left, ld);
int maxr = width(root->right, rd);
//ld和rd分别表示左子树和右子树高度
//根节点的高度等于两者中较大者加一
dept = max(ld, rd) + 1;
return max(maxl, max(maxr, ld + rd));
}
int max_width(Node *root)
{
int dept = 0;
return width(root, dept);
}
//data.txt的内容如下
//A B D G # # # E # F # H # # C # #
int main()
{
Node *root = NULL;
fin.open("data.txt",ios_base::in);
create_btree(&root);
preorder_visit(root);
cout<<endl<<max_width(root)<<endl;
fin.close();
}