• 求二叉树中节点的最大距离


    编程之美中的一道题

    编程之美中採用的解法是一种侵入式的

    解法例如以下

    struct NODE
    {
        NODE* pLeft;        // 左子树
        NODE* pRight;       // 右子树
        int nMaxLeft;       // 左子树中的最长距离
        int nMaxRight;      // 右子树中的最长距离
        char chValue;       // 该节点的值
    };
     
    int nMaxLen = 0;
     
    // 寻找树中最长的两段距离
    void FindMaxLen(NODE* pRoot)
    {
        // 遍历到叶子节点。返回
        if(pRoot == NULL)
        {
            return;
        }
     
        // 假设左子树为空,那么该节点的左边最长距离为0
        if(pRoot -> pLeft == NULL)
        {
            pRoot -> nMaxLeft = 0; 
        }
     
        // 假设右子树为空,那么该节点的右边最长距离为0
        if(pRoot -> pRight == NULL)
        {
            pRoot -> nMaxRight = 0;
        }
     
        // 假设左子树不为空,递归寻找左子树最长距离
        if(pRoot -> pLeft != NULL)
        {
            FindMaxLen(pRoot -> pLeft);
        }
     
        // 假设右子树不为空。递归寻找右子树最长距离
        if(pRoot -> pRight != NULL)
        {
            FindMaxLen(pRoot -> pRight);
        }
     
        // 计算左子树最长节点距离
        if(pRoot -> pLeft != NULL)
        {
            int nTempMax = 0;
            if(pRoot -> pLeft -> nMaxLeft > pRoot -> pLeft -> nMaxRight)
            {
                nTempMax = pRoot -> pLeft -> nMaxLeft;
            }
            else
            {
                nTempMax = pRoot -> pLeft -> nMaxRight;
            }
            pRoot -> nMaxLeft = nTempMax + 1;
        }
     
        // 计算右子树最长节点距离
        if(pRoot -> pRight != NULL)
        {
            int nTempMax = 0;
            if(pRoot -> pRight -> nMaxLeft > pRoot -> pRight -> nMaxRight)
            {
                nTempMax = pRoot -> pRight -> nMaxLeft;
            }
            else
            {
                nTempMax = pRoot -> pRight -> nMaxRight;
            }
            pRoot -> nMaxRight = nTempMax + 1;
        }
     
        // 更新最长距离
        if(pRoot -> nMaxLeft + pRoot -> nMaxRight > nMaxLen)
        {
            nMaxLen = pRoot -> nMaxLeft + pRoot -> nMaxRight;
        }
    }


    我在解决问题时。想到的还有一个算法,推断一棵树是否是平衡二叉树,以下是我的解决方法,使用的php语言
    	public function getMaxDistance($node,&$Max){
    		
    		if(null == $node){
    			return 0;
    		}
    		
    		$left = $this->getMaxDistance($node->lchild,$Max);
    		$right = $this->getMaxDistance($node->rchild,$Max);
    		
    		if($Max < ($left+$right)){
    			$Max = $left + $right;
    		}
    		
    		return 1+($left>$right?

    $left:$right); }




  • 相关阅读:
    day12 bash中的if、for
    day11 grep正则匹配
    day10 nfs服务,nginx负载均衡,定时任务
    SpringMVC11文件上传
    SpringMVC10数据验证
    SpringMVC09异常处理和类型转化器
    SpringMVC08转发和重定向
    SpringMVC07处理器方法的返回值
    SpringMVC06以对象的方式获取前台的数据
    SpringMVC05使用注解的方式
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8558336.html
Copyright © 2020-2023  润新知