求二叉樹中節點的最大距離

題目描述

如果我們把二叉樹看成一個圖,父子節點之間的連線看成是雙向的,我們姑且定義“距離”爲兩個節點之間的變數。

寫一個程序求一棵二叉樹中相距最遠的兩個節點之間的距離。
輸入要求

輸入的第一行包含單獨的一個數字T,表示測試序列的數目;
  以下每一行爲一個測試序列,測試序列是按先序序列輸入字符 ,如果節點沒有左或右孩子,則輸入用空格表示,最後用一個空格結束一行的輸入。

輸出要求

 輸出二叉樹中相距最遠的兩個節點之間的距離
假如輸入

2
ABC  DE G  F    
-+a  *b  -c  d  /e  f   

應當輸出

4
6


借鑑了許多代碼,最後優deepth()化到最簡已經,思路就是遍歷每個節點,空節點爲-1,最終的結果肯定是某個節點左子樹的深度加上右子樹的深度加2,所以求出每個節點左子樹和右子樹的深度,取左右子樹深度之和加2的最大值即可。 

Code:



#include<bits/stdc++.h>
using namespace std;
typedef struct BTree
{
    char data;
    struct BTree *left,*right;
}BTree;
BTree *CreatBTree()
{    
    char ch=getchar();
    if(ch==' ')
        return NULL;
    BTree *temp=(BTree *)malloc(sizeof(BTree));
    temp->data=ch;
    temp->left=CreatBTree();
    temp->right=CreatBTree();
    return temp;
}
int deepth(BTree *T,int &maxDis)
{
    if(!T)
        return -1;
    int L=deepth(T->left,maxDis);
    int R=deepth(T->right,maxDis);
    maxDis=max(maxDis,L+R+2);
    return max(L,R)+1;
}
void delBTree(BTree *p)
{
    if(p)
    {
        delBTree(p->left);
        delBTree(p->right);
        free(p);
    }
}
int main()
{    
    int t;
    cin>>t;    
    while(t--)
    {    
        getchar();//吃掉回車
        int maxDis=-1;        
        BTree *root=CreatBTree();
        getchar();//吃掉最後結尾的空格
        deepth(root,maxDis);
        cout<<maxDis<<endl;
        delBTree(root);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章