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,这明显是不正确的。
因为上述方法将兄弟结点的度默认加入了从A到I的路径长度之中,而我们求树的深度必须计算出其准确的路径长度。同样的,A到F的路径长度与A到H的路径长度都是不正确的。
最大特点:
相较于二叉树的递归求深度,树转换成二叉树的递归求深度代码中无意中增加了多余的一步,那就是经历过了兄弟结点。这一步需要进行不认可处理,这样最后得到的深度才是准确的。
三、树的递归求度数代码更改
具体代码的重现
二叉树求深度(递归)
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。这就是对我继续创作最大的鼓励!!最后纳兹咩献上~~
引用需经过本博客作者同意,且为非营利性!未经允许,严禁转载!