面试题:求二叉树节点间的最大距离

本文用c++写,主要思路是使用递归求得所有节点的左右子树的深度,求左右深度的和,最后更新最大的width。

代码如下:

#include <iostream>

typedef struct tNode
{
     tNode(int data){
        this->data = data;
        left = right = NULL;
     }

     int data;
     struct  tNode* left;
     struct  tNode* right; 
     
}TreeNode;


static int g_max_width = 0;//全局变量用于记录最大宽度

int maxTreeDepth(TreeNode*root){
    if(root == NULL)
        return 0;    
/*
*     5
*   3       10
*       8       11
*     6   9
*  最大4: 3-5-10-  8-9 或 3-5-10-8-6 
*
*/    
//对于每一个节点都要使用局部变量lhs和rhs,
//这样在数据量特别大的时候,存在栈内存耗尽

//最好的办法是把lhs与rhs放进TreeNode中

    int lhs = root->left == NULL? 0 : maxTreeDepth(root->left)+1;
   
    int rhs = root->right == NULL? 0 : maxTreeDepth(root->right)+1;

    if(lhs + rhs > g_max_width)
        g_max_width = lhs + rhs;

    return lhs > rhs ? lhs:rhs;
    
}


int TreeWidth(TreeNode* tree){
    g_max_width = 0;
    maxTreeDepth(tree);
    return g_max_width;
}

TreeNode* createNode(int data){
    return new TreeNode(data);
}

void add_tree(TreeNode**tree,int data){
    if(tree==NULL)
        return ;
    if(*tree == NULL){
        *tree = createNode(data);
        return ;
    }

    TreeNode*root = *tree;
    if(data > root->data){
        add_tree(&root->right,data);
    }else {
        add_tree(&root->left, data);
    }
}

int main(int argc,char *argv[]){

    TreeNode *tree=NULL;
    
    /*
    *     5
    *   3       10
    *       8       11
    *     6   9
    */
//3-5-10-8-9 或 3-5-10-8-6
//width:4

    add_tree(&tree,5);    
    add_tree(&tree,3);    
    add_tree(&tree,10);
    add_tree(&tree,8);
    add_tree(&tree,6);
    add_tree(&tree,9);
    add_tree(&tree,11);
    
    std::cout<<"width:"<<TreeWidth(tree)<<std::endl;

        /*
    *     5
    *   3       10
    *       8       11
    *     6   9         25
                     15    29
                  12    18
                      17
    */
//3-5-10-11-25-29-18-17 
//width:7
    add_tree(&tree,25);
    add_tree(&tree,15);
    add_tree(&tree,12);
    add_tree(&tree,18);
    add_tree(&tree,29);
    add_tree(&tree,17);

    std::cout<<"width:"<<TreeWidth(tree)<<std::endl;

/*
 *       40
    17
 10     25
     20
  18     24
      22
        
 */
 //10-17-25-20-24-22
 //width:5
 
   TreeNode *tree1=NULL;
    add_tree(&tree1,40);
    add_tree(&tree1,17);
    add_tree(&tree1,10);
    add_tree(&tree1,25);
    add_tree(&tree1,20);
    add_tree(&tree1,18);
    add_tree(&tree1,24);
    add_tree(&tree1,22);
    std::cout<<"width:"<<TreeWidth(tree1)<<std::endl;
    
}

代码中存在的问题我已经注释,我也在main函数中写了简单的测试,当然以上不是最优解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值