【IT笔试面试题整理】 二叉树任意两个节点间最大距离

求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数, 比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。

一种是:经过根节点,此时只需要求出左右子树的最大深度就可以

另一种:不经过根节点,此时需要递归求解左右子树,然后比较左右子树中最大距离,求大者

 

  1  #include "stdio.h"
  2  #include"stdlib.h" 
  3  struct NODE
  4     {
  5          NODE* pLeft;            // 左子树
  6          NODE* pRight;          // 右子树
  7          int nMaxLeft;          // 左子树中的最长距离
  8          int nMaxRight;         // 右子树中的最长距离
  9          int chValue;        // 该节点的值
 10     };
 11    
 12     int nMaxLen = 0;
 13    
 14     // 寻找树中最长的两段距离
 15     void FindMaxLen(NODE* pRoot)
 16     {
 17          // 遍历到叶子节点,返回
 18          if(pRoot == NULL)
 19               return;
 20  
 21          // 如果左子树为空,那么该节点的左边最长距离为0
 22          if(pRoot -> pLeft == NULL)   
 23               pRoot -> nMaxLeft = 0;
 24          
 25    
 26          // 如果右子树为空,那么该节点的右边最长距离为0
 27          if(pRoot -> pRight == NULL)   
 28               pRoot -> nMaxRight = 0;
 29          
 30    
 31          // 如果左子树不为空,递归寻找左子树最长距离
 32          if(pRoot -> pLeft != NULL)       
 33               FindMaxLen(pRoot -> pLeft);
 34          
 35    
 36          // 如果右子树不为空,递归寻找右子树最长距离
 37          if(pRoot -> pRight != NULL)      
 38               FindMaxLen(pRoot -> pRight);
 39          
 40    
 41          // 计算左子树最长节点距离
 42          if(pRoot -> pLeft != NULL)
 43          {
 44               int nTempMax = 0;
 45               if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight)
 46               {
 47                    nTempMax = pRoot -> pLeft -> nMaxLeft;
 48               }
 49               else
 50               {
 51                    nTempMax = pRoot -> pLeft -> nMaxRight;
 52               }
 53               pRoot -> nMaxLeft = nTempMax + 1;
 54          }
 55    
 56          // 计算右子树最长节点距离
 57          if(pRoot -> pRight != NULL)
 58          {
 59               int nTempMax = 0;
 60               if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight)
 61               {
 62                    nTempMax = pRoot -> pRight -> nMaxLeft;
 63               }
 64               else
 65               {
 66                    nTempMax = pRoot -> pRight -> nMaxRight;
 67               }
 68               pRoot -> nMaxRight = nTempMax + 1;
 69          }
 70    
 71          // 更新最长距离
 72          if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen)
 73          {
 74               nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;
 75          }
 76      }
 77          
 78 NODE *createTree()
 79 {
 80     NODE *root;
 81     int data;
 82     printf("input data:");
 83     scanf("%d",&data);
 84     //printf("output data:%d\n",data);
 85     
 86     if(data==0)
 87       root=NULL;
 88     else/*根左右 前序建立二叉树*/
 89     {
 90         root=(NODE*)malloc(sizeof(NODE));
 91         root->chValue=data;
 92         root->pLeft=createTree();
 93         root->pRight=createTree();    
 94     }
 95     return root;
 96 } 
 97 int main()
 98 {
 99     NODE  *root;
100     root=createTree();
101     FindMaxLen(root);
102     
103     printf("%d",nMaxLen);
104     return 0;
105 }
原文地址:https://www.cnblogs.com/WayneZeng/p/3034187.html