【编程题目】求二叉树中节点的最大距离

第 11 题(树)
求二叉树中节点的最大距离...
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。

思路:二叉树结构中只设了左右子节点的指针。

设单个结点的深度为0。

用后序遍历,得到每个结点为根的子树的最大深度。maxdistance记录该结点(左子树深度+右子树深度 + 2)是否超过已有的最远距离,若超过更新。

关键:空指针的深度设为-1,这样避免了复杂的分类讨论。

树每个结点记录的深度

              (4)

         /

  (3)   :举例计算 子树中最大的深度是2,当前结点最大深度是2+1    整棵树最大距离为 1 + 2 + 2 = 5 比已有的

  /     \               整棵树的最大距离大,更新。

   (1)     (2)

/         /     \

(0)     (1)     (0)

/

(0) :其左右子树均为空,记其子树的最大深度为-1 当前结点的深度为 -1 + 1 = 0

代码如下:唯一不满意的是maxdistance设为了全局变量,看起来很丑。

/*
第 11 题(树)
求二叉树中节点的最大距离...
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,
我们姑且定义"距离"为两节点之间边的个数。
写一个程序,
求一棵二叉树中相距最远的两个节点之间的距离。
start time 16:17
end time 17:20
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTree
{
    int data;
    BiTree * p_left, * p_right;
}BiTree;

void CreateBiTree(BiTree * &T)
{
    int d;
    printf("please input data number:");
    scanf("%d", &d);
    if (d != 0)
    {
        T = (BiTree *)malloc(sizeof(BiTree));
        T->data = d;
        T->p_left = NULL;
        T->p_right = NULL;
        CreateBiTree(T->p_left);
        CreateBiTree(T->p_right);
    }
}

//递归
int maxdistance = 0;
int  BiTreeMaxDistance(BiTree * T) //利用后序遍历
{
    if (T == NULL)
    {
        return -1;
    }
    else
    {
        int l = BiTreeMaxDistance(T->p_left);
        int r = BiTreeMaxDistance(T->p_right);
        int distance = l + r + 2;
        maxdistance = (distance > maxdistance) ? distance : maxdistance;
        return (l > r) ? l + 1 : r + 1;
    }
}

int main()
{
    BiTree * T = NULL;
    CreateBiTree(T);
    BiTreeMaxDistance(T);

    printf("the max distance of the tree is %d.\n", maxdistance);

    return 0;
}

网上找答案,发现居然是《编程之美》里的题。然后,书里的代码也用了全局变量...感觉书里的方法没有我的方法简洁,代码也比我的看起来复杂。不过整体思路还是一样的。

又看了几个人的博客,发现有几个和我的思路是一样的。真可谓英雄所见略同啊。

时间: 2024-08-16 00:04:06

【编程题目】求二叉树中节点的最大距离的相关文章

编程之美之求二叉树中节点的最大距离

题目:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 分析:树上分析的很清楚,计算一个二叉树的最大距离有两个情况: 1. 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点. 2. 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者. 但是树上的代码使用了额外的节点字段,这里给出我的代码,思路是一样的: struct BinaryTree { int valu

11求二叉树中节点的最大距离

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4253605.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:如果我们把二叉树看成一个图,一棵树显示是一颗有向无环图,定义"距离"为两节点之间边的个数(不考虑方向).写一个程序,求一棵二叉树中相距最远的两个节点

11.求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义 " 距离 " 为两节点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离,求二叉树中节点的最大距离 分析: 先画几个不同形状的二叉树,从例子中可以看出,相距最远的两个节点,一定是两个叶子节点,或者是一个叶子节点到它的根节点: 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论. 对于任意一个节点,以该节点为根,假设这个根有 K 个孩子节点,那么相距最远的两 个节点 U和 V之间的路

编程之美3.8 求二叉树中节点的最大距离

描述:如果把二叉树看成一个图,父子节点之间的连线看成双向的,定义“距离”为两个节点之间边的个数.求二叉树中相距最远的两个节点的距离. 思路:相距最远的两个节点一定是叶子节点,且这两个叶子节点的路径有两种情况: 1. 该路径经过root节点,则两个叶子节点分属root.left和root.right为根的子树,而且是两个子树中距离root.left和root.right最远的叶子节点: 2. 该路径不经过root节点,则这两个叶子节点的root.left或root.right上: 根据以上分析,参

【算法题目】求二叉树中节点的最大距离

如果我们把二叉树视为一个图,父子节点之间的连线视为双向的,我们姑且定义为“举例”为两节点之间边的个数.写一个程序求一颗二叉树中相距最远的两个节点之间的距离(<编程之美>3.8) 思路:如果两个节点相距最远,一定是两个叶子节点,或者是一个叶子节点到它的根节点. 根据相距最远的两个节点一定是叶子节点这个规律,我们可以进一步讨论.    对于任意一个节点,以该节点为根,假设这个根youk个孩子节点,那么相距最远的两个节点U和V之间的路径与这个根节点的关系有两种情况. 1.若路径经过根Root,则U和

编程之美---求二叉树中节点的最大距离

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数.写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 解法:用递归的方法 1 // 数据结构定义 2 struct NODE 3 { 4 NODE* pLeft; // 左子树 5 NODE* pRight; // 右子树 6 int nMaxLeft; // 左子树中的最长距离 7 int nMaxRight; // 右子树中的最长距离 8 char chValue; // 该节点

3.8 求二叉树中节点的最大距离

题目: 把二叉树看成一个图,父子节点之间的连线看成是双向的,定义"距离"为两个节点之间的边数. 求一颗二叉树中的两个节点之间的距离的最大值. 方法一:用书上写的方法: 代码: struct node { node *left; node *right; int nMaxLeft; int nMaxRight; char ch; }; int nMaxLength = 0; void FindMaxDistance(node *root) { if(root == NULL) retur

求二叉树中节点的最大距离

题目描写叙述 假设我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两个节点之间的变数. 写一个程序求一棵二叉树中相距最远的两个节点之间的距离. 输入要求 输入的第一行包括单独的一个数字T,表示測试序列的数目: 下面每一行为一个測试序列,測试序列是按先序序列输入字符 ,假设节点没有左或右孩子,则输入用空格表示,最后用一个空格结束一行的输入. 输出要求 输出二叉树中相距最远的两个节点之间的距离 假如输入 2 ABC  DE G  F -+a  *b  -c 

第11题:求二叉树中节点的最大距离

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44984331 第11题:如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两点之间边的个数.写一个程序,求一棵二叉树中相距最远的两个节点之间的距离. 树的高度是一个重要信息,然后就可以祭出递归大法了. 代码 package test011; import test004.Node; /** * Created by cq o