zoukankan      html  css  js  c++  java
  • 求二叉树中节点的最大距离

    编程之美中的一道题

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

    解法例如以下

    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); }




  • 相关阅读:
    [书目20110210]信息系统项目管理师教程(第2版)目录
    [文摘2010220]投资人不可不知的股市法则
    生活是自我的选择和过滤
    [书目20110210]系统架构设计师教程 目录
    [转]6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱
    [书目]给总经理的101条忠告
    项目管理工具 之 microsoft project help
    [文摘20110216]职业经理人必备十素质
    [文摘20110226]于丹的一百一十句人生忠告
    学习需要用心 规划和落实
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8558336.html
Copyright © 2011-2022 走看看