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




  • 相关阅读:
    day16(链表中倒数第k个结点)
    day15(C++格式化输出数字)
    day14(调整数组顺序使奇数位于偶数前面 )
    day13(数值的整数次)
    day12(二进制中1的个数)
    day11(矩形覆盖)
    day10(跳台阶)
    hadoop 又一次环境搭建
    Hive 学习
    hadoop -工具合集
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8558336.html
Copyright © 2011-2022 走看看