我思故我在系列—数据结构面试11题(题目搜集整理者V_JULY_V,非常感谢!!)

现实和梦想之间的惟一屏障就是努力尝试的信仰,相信一定能行的信仰。

                                 ——摘自 奥格.曼狄诺《羊皮卷》

第11 题

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

求一棵二叉树中相距最远的两个节点之间的距离。

#include<iostream>
#include<assert.h>
using namespace std;

typedef struct NODE
{
    NODE* leftchild;
    NODE* rightchild;
    int nMaxLeft;
    int nMaxRight;
    int data;
}Tnode,*tree;
int nMaxLen = 0;

int FindMaxLen(NODE* pRoot)
{
     assert(pRoot!=NULL);

   /*leaf node */
  if(pRoot -> leftchild== NULL)
       {
     pRoot -> nMaxLeft = 0;
       }

  if(pRoot -> rightchild == NULL)
      {
     pRoot -> nMaxRight = 0;
       }

  /*recursion*/
  if(pRoot -> leftchild != NULL)
      {
     FindMaxLen(pRoot ->leftchild);
     int nTempMax = 0;

      if(pRoot -> leftchild -> nMaxLeft > pRoot -> leftchild -> nMaxRight)
                     {
                   nTempMax = pRoot -> leftchild -> nMaxLeft;
                       }
         else
                     {
                   nTempMax = pRoot -> leftchild -> nMaxRight;
                       }
          pRoot -> nMaxLeft = nTempMax + 1;
      }

  if(pRoot -> rightchild != NULL)
      {
     FindMaxLen(pRoot -> rightchild);
     int nTempMax = 0;
     if(pRoot -> rightchild -> nMaxLeft > pRoot -> rightchild -> nMaxRight)
                 {
           nTempMax = pRoot -> rightchild -> nMaxLeft;
                   }
     else
                  {
           nTempMax = pRoot ->rightchild-> nMaxRight;
                  }
      pRoot -> nMaxRight = nTempMax + 1;
     }

    /*reflash maxlength*/
   if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen)
           {
          nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;

           }
      return nMaxLen;
}

tree create_tree(int* ptr,int i)
{
    tree T=NULL;
    T=(tree)malloc(sizeof(Tnode));
    if(ptr[i] != 0)
        {
            T->data=ptr[i];
            T->leftchild=create_tree(ptr,i*2+1);
            T->rightchild=create_tree(ptr,i*2+2);
        }
    else
        {
            T= NULL;
        }
    return T;
}

void destroy(tree T)
{
    tree T1;
    if(T!=NULL)
        {
            T1=T;
            destroy(T1->leftchild);
            destroy(T1->rightchild);
            printf("free node %d",T->data);
            free(T1);
            T1=NULL;
        }
}
int main()
{
        tree T1=    NULL;
        int max;
        int arr[]={10,6,14,4,8,12,16,0,0,0,0,0,0,0};
        T1=create_tree(arr,0);
        max=FindMaxLen(T1);
        cout<<"maxlength:"<<max<<endl;
        destroy(T1);
        return 1;
    }



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fmoonstar/article/details/6873023
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭