如题,我搜了搜求二叉树,搜到好多方法,我挑一下我觉得几个简单的递归求高度的方法。
得先说一下我建树的习惯:
struct tree
{
char data;
tree *lboy; 男左女右,所以我就是左孩子leftboy,右孩子rightgirl。
tree *rgirl;
};
第一种:
int h1(tree *root)
{
if(!root) return 0;
else
{
int m = h1(root->lboy);
int n = h1(root->rgirl);
return(m > n) ? (m + 1) :(n + 1);
}
}
关于这个+1是干啥的。首先我再提醒一下这是递“归”的思想。
意思如果根有孩子,当孩子”归“的时候带回来个1。 自身再比较一
下左孩子带过来的1多还是右孩子带过来的1多。如果没孩子的话,
他孩子带回来的就是0,但是他本身算一层,所以+1;
这一种我看到一个评论里发了个更简化的,真是短!!小精悍!!!
int h1(tree* root)
{
if( !root ) return 0;
return max(h1(root->lboy), h1(root->rgirl)) + 1;
}
反正我是被感动了,两行结束。
第二种:
int max1 = 0;
int h2(tree *root, int depth)
{
if(root)
{ /////下边两个if就是表示如果还有左右孩子的话,深度就加一,让孩子继续向下延伸;
if(root->lboy)
h2(root->lboy, depth+1);
if(root->rgirl)
h2(root->rgirl, depth+1);
}
if(depth > max1) max1 = depth;
//////// 因为不知道那个孩子延伸的最深,所以就判断一下最深是多少。
return max1; 返回最深的值就行。
}
对于这个初始是输入depth = 1就行:也就是 h2(root, 1);
更新!!!!!!
写到平衡二叉树,发现新的求高度的方法,我给一下新的方法。
上边的两种方法有个缺点,每次求一个点的高度都得从新递归求,如果我们建立二叉树的时候就把每个结点的高度求出来,然后再插入新的结点时,我们就可以调用原来那些已经求过的结点的高度了,不用从新递归求过来一遍了!!!
关于树的高度,深度,结点的高度深度,不同的树有不同的定义,推荐个分析:
https://blog.csdn.net/qq_36667170/article/details/84142019
struct tree
{
int data;
tree *lboy;
tree *rgirl;
int high; high的缩写
};
int hi(tree *root)
{
if ( !root ) return 0;
return root->high;
}
创建二叉树时在return root前加一句东西,也就是下面的:
root->high = max( hi(root->lboy), hi(root->rgirl) ) + 1;
return 0;
除此之外,我搜到的有个总结:
算法一:采用后序遍历二叉树,结点最大栈长即为二叉树的高度;
算法二:层次遍历二叉树,最大层次即为二叉树的高度;
算法三:采用递归算法,求二叉树的高度。
我还是喜欢代码少的233,如果对那两个感兴趣,可以去看一下
https://blog.csdn.net/NCC__dapeng/article/details/83817302
我醒来时,阳光在草地上飞扬。