zoukankan      html  css  js  c++  java
  • 【编程题目】求二叉树中节点的最大距离

    第 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.
    ", maxdistance);
    
        return 0;
    }

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

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

  • 相关阅读:
    Asp.Net Mvc Filter
    使用 EntityFramework后把一个对象序列化成json字符串引起循环引用的问题
    RCTF2020 calc & EasyBlog & swoole
    GKCTF-EzWeb+redis未授权访问
    BJD3rd
    http走私
    网鼎杯2020青龙组 web writeup
    De1CTF 2020 部分web
    js相关trick总结
    xss常见编码解析
  • 原文地址:https://www.cnblogs.com/dplearning/p/3968973.html
Copyright © 2011-2022 走看看