c语言二叉树问题,代码不太理解,求大神解释,急

问题描述

c语言二叉树问题,代码不太理解,求大神解释,急

问题:A Binary Tree is called balanced if, for each node in the tree, the height of its left and right subtrees differ by no more than one. Write a function
int height_if_balanced( Tnode *root )
which returns -1 if the tree is not balanced, and returns the height of the tree, if it is balanced.

代码:

int height_if_balanced( Tnode *root )
{
int leftHeight, rightHeight, heightDiff;

if( root == NULL ) {
return 0; // tree is empty
}

leftHeight = height_if_balanced( root->left );
rightHeight = height_if_balanced( root->right );

if( leftHeight == -1 || rightHeight == -1 ) {
// if either the left or right subtree is unbalanced,
return -1 ; // then the whole tree is unbalanced
}

heightDiff = leftHeight - rightHeight;

if( heightDiff < -1 || heightDiff > 1 ) {
return -1; // tree is unbalanced
}

// tree is balanced, so we return its height
if( heightDiff > 0 ) {
return( leftHeight + 1 );
}
else {
return( rightHeight + 1 );
}
}

解决方案

其实这个英文注解很清楚了,这个函数的功能是判断这棵二叉树是否为平衡的
所谓的平衡是指两边子树的高度之差绝对值不大于1
height_if_balanced()这个函数如果二叉树是平衡的输出高度(取左右子树中高度加大的),否则输出-1
然后height_if_balanced()是一个递归函数,一层一层下去直到叶子节点跳出,最后返回高度
纯手打, 还有什么不懂的地方再问吧

解决方案二:

C语言二叉树知识点讲解与实现代码
C语言二叉树与队列实现基础代码

时间: 2024-11-01 22:45:49

c语言二叉树问题,代码不太理解,求大神解释,急的相关文章

c语言链表代码求大神解释

问题描述 c语言链表代码求大神解释 insert中的 while( next_node && new_node->data > next_node->data) 是什么意思? 还有excise是什么意思,干什么用的? 最近在学链表,学不清楚... #include #include #include "list.h" /* Create a new node containing the specified data, and return a poi

printf-c语言的一道题 动态规划 新手,求大神看看我代码的问题

问题描述 c语言的一道题 动态规划 新手,求大神看看我代码的问题 描述 7 3 8 8 1 0 2 7 4 4 4 5 6 2 5 (图1) 图1显示了一个三角形数. 编写一个程序,计算最高金额的数字传递路线,从顶部开始和结束的地方固定在底座上. 每一步可以走斜向下向左或向右斜下. 输入 程序从标准输入读取. 第一行包含一个整数N:三角形的行数. 以下N行描述三角形的数据. 在三角形的行数> 1但< = 100. 三角形的数量,所有的整数,在0到99之间. 输出 你的程序是编写到标准输出. 最

阶乘 算法-网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法

问题描述 网上找的c语言的求大数阶乘的答案 看不太懂这个算法 求大神解释算法 #include int main() { ??? int n; ??? int a[9000]; //确保保存最终运算结果的数组足够大 ???? int digit = 1; //位数 ???? int temp;?? //阶乘的任一元素与临时结果的某位的乘积结果 ???? int i, j, carry; //carry:进位 ???? printf("please in put n:n"); ??? s

刚接触IO流有一段代码不理解求大神给我说明一下

问题描述 刚接触IO流有一段代码不理解求大神给我说明一下 红色框框标记的是不明白的. 再次表示感谢! 解决方案 Java 下 IO 中Reder 和 InputStream 分别是以字符和字节的形式来完成数据的读取的,然而返回值确是 int 类型的数据,这样做的核心目的只是要取到到一个 int 类型下的 -1 来表示数据流的末尾. 此次使用的read(b,0,512)是将文件中的数据读取到字节缓冲区b中,并返回读取到的字节的总数.循环读取文件内容到缓冲区,并写入另一个文件中.循环处理直到到达读取

c语言-C语言的这个代码表达不了,大神帮忙看看。

问题描述 C语言的这个代码表达不了,大神帮忙看看. #include #define N 50 //学生人数 #define M 3 //课程门数 void Input(int score[][M+3], int n); { int i, j, sum; printf("Input Number and %d score:n",M); for (i = 0; i < n; i++) { sum = 0; printf("%d:",i+1); for (j =

c语言代码问题,有疑问,求大神解释

问题描述 c语言代码问题,有疑问,求大神解释 这个function的机理是什么? 为什么第二个循环只有分号...有什么作用 求大神解释 char *mystery( char *a, char *b ) { char *c = a; while ( *c != '' ) { c++; } while (( *c++ = *b++ ) != '' ) ; return a; } 解决方案 第一个循环,c指向了a字符串的末尾: 第二个循环,把b指向的字符串拷贝到a字符串后面了. 解决方案二: 求大神

关于socket的问题,求大神解释一下以上代码,本人小白不太懂

问题描述 关于socket的问题,求大神解释一下以上代码,本人小白不太懂 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; import java.nio.charset.Charset; impor

java代码-为什么报空不理解求大神

问题描述 为什么报空不理解求大神 给了图 不知道 能不能帮我解决 可能是我内存没搞懂 哪位大神帮我指点指点 解决方案 我的图呢? 醉了.. 解决方案二: 图在这.. 网络不好 解决方案三: pd方法中报错,第25行,调试吧,对象为空 解决方案四: 看样子是 db.root.left是null,你可以在控制台输出看一下.根据你的逻辑没看到给这个对象赋值的地方

ormat essage-C++代码看不懂,求大神指点

问题描述 C++代码看不懂,求大神指点 FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, (LPTSTR) &lpMsgBuf, 0, NULL ); 这段代码不太清楚什么意思,尤其是 (LPTSTR) &lpMsgBuf这句,请大神们指点指点 解决方案 把错误转换成到lpMs