Java求树的深度(真的是树,而不是二叉树)#全网首发#

Java求树的深度(真的是树,而不是二叉树)#全网首发#

相信对于二叉树递归求深度这个问题,我们已经非常熟悉。
那么对于递归求深度应该可以类似地使用二叉树递归求深度的方法。

具体代码的实现

二叉树求深度(递归)
int Tree::treeDepth(TNode *bt) {
        if (bt == NULL)return 0;
        // 计算左子树的深度
        int a = treeDepth(bt.leftchild);
        // 计算右子树的深度
        int b = treeDepth(bt.rightchild);
        // 二叉树bt的深度=路径最长的子树深度 + 1
        return (a >= b)?(a + 1) : (b + 1);
    }
树求深度(递归)
int Tree::treeDepth(TNode *bt)
{
    if(bt == NULL)return 0;
    else{
        int a = treeDepth(bt->firstchild);
        int b = treeDepth(bt->rightsib);
        if(bt->rightsib != NULL)
        return (a >= b)?(a+1):b;
        else
        return (a >= b)?(a+1):(b+1);
    }
}

1.解决树递归求深度的问题关键在于:树与二叉树的转换
2.用对二叉树递归求深度的理念来解决递归求深度的问题。
3.可以看到上述两个代码的区别在于最后的return代码,这就是我们要对转换成二叉树之后进行的特殊处理。

树的递归求深度讲解

一、树转换成二叉树:

1.加线——中所有的相邻兄弟结点之间加一条线;
2.去线——对中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线;
3.层次调整——按照二叉树结点之间的关系进行层次调整。
树转换成二叉树过程

二、树的递归求深度特别之处

1.首先,我们举个栗子:
这是一棵
这是一棵树
而这是那一棵转换成的二叉树
树转换成二叉树以后的样子
通过上述的二叉树求深度(递归)方法得到以下内容:
(中的firstchild相当于二叉树中的leftchild中的rightsib相当于二叉树中的rightchild)
二叉树的递归求深度图解

可以看到通过这种方法求得的深度是5,这明显是不正确的。
因为上述方法将兄弟结点的度默认加入了从AI路径长度之中,而我们求的深度必须计算出其准确的路径长度。同样的,AF路径长度AH路径长度都是不正确的。

最大特点:

相较于二叉树递归求深度,转换成二叉树递归求深度代码中无意中增加了多余的一步,那就是经历过了兄弟结点。这一步需要进行不认可处理,这样最后得到的深度才是准确的。

三、树的递归求度数代码更改

具体代码的重现
二叉树求深度(递归)
int Tree::treeDepth(TNode *bt) {
        if (bt == NULL)return 0;
        // 计算左子树的深度
        int a = treeDepth(bt.leftchild);
        // 计算右子树的深度
        int b = treeDepth(bt.rightchild);
        // 二叉树bt的深度=路径最长的子树深度 + 1
        return (a >= b)?(a + 1) : (b + 1);
    }
树求深度(递归)
int Tree::treeDepth(TNode *bt)
{
    if(bt == NULL)return 0;
    else{
        int a = treeDepth(bt->firstchild);
        int b = treeDepth(bt->rightsib);
        if(bt->rightsib != NULL)
        return (a >= b)?(a+1):b;
        else
        return (a >= b)?(a+1):(b+1);
    }
}

上述求深度代码中:if(bt->rightsib != NULL)。这一步将会识别出经历过兄弟结点的度,并且不再认可经历过兄弟结点的度了。代码同样不再return b+1,取而代之的是return b
具体图解如下:
不被认可的红色的度图解
最后求出树的深度终于是4啦!答案正确!

最后总结一下:利用树的递归方法求深度,需要理解树转换成二叉树后结构发生的独特变化。

发掘出其中的秘密——虽然二者遍历时经过的路径相同,但需要被认可的度却不相同。因为在树中,经过的兄弟结点之间的路径,并不能像二叉树中经过的右孩子结点之间的路径一样,被算入右子树的度中!!

做文章不易,希望能得到大佬们的一键三连QAQ。这就是对我继续创作最大的鼓励!!最后纳兹咩献上~~
夏目真好
引用需经过本博客作者同意,且为非营利性!未经允许,严禁转载!

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值