求二叉树深度以及寻找二叉树中某一节点值

求二叉树的深度依然用的是二叉树递归的特性。二叉树的深度就是你根节点的这一层加上他左孩子或者右孩子中深度大的哪一个,同样这也能被划分为子问题。
 

size_t BTreeDepth(BTNode* root)
{
if (root == NULL)
return 0;
if (BTreeDepth(root->_left) > BTreeDepth(root->_right))
return 1 + BTreeDepth(root->_left);
else
return 1 + BTreeDepth(root->_right);
}


这里需要多进行的一步是深度大小的判断,让1加上你左孩子或者右孩子深度大的那个,就需要比较两个深度,当然这里也可以用更简单清晰的三步运算符来计算。
return (BTreeDepth(root->_left) > BTreeDepth(root->_right))? 1 + BTreeDepth(root->_left) :1 + BTreeDepth(root->_right);


(a > c) ? a : c 三步运算符是如果a>c 那么执行a语句,如果不大于那就执行c语句。
 
第二个函数是查找二叉树中的某个数据,同样是递归,但是你在写的时候会遇到一个问题。
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
if (root== NULL)
return NULL;
if (root->_data == x)
return root;
else
{
BTreeFind(root->_left, x);
BTreeFind(root->_right, x);
}
}


你运用递归写出来的程序是这样的,能运行吗?你会发现有时候你的程序编译没有错误但是每次运行都会出错误不能正确输出你要的东西
 
还拿之前这个图来走一遍,假如你现在查找的是3,进来1不为空,但是也不等于你找的3就开始往else里边的语句走,先走他的左孩子的递归,进来之后是2,不等于3,又开始往他的左孩子走,走到3发现等于3啊,这时候要返回root了,返回成功,这时候在root是2的函数中,往左子树的递归已经结束了,开始走下一句,结果进入到了2的右孩子中,遇到4左右孩子是空那就开始返回空。
其实简单的形容起来就是,你虽然找到了你的3但是函数并不知道你找到了,他还是会一直找下去,因为有两种情况都会返回一种是找到了对应的值,一种是空,所以即使你找到了,最终返回的也不是你的返回值。那应该怎么写呢?你需要的是开始进入下一次递归之前判断一下,你的上一层递归返回给你的地址是不是就是你要找的那个地方的地址,如果是那就不用再继续走下去了,直接返回上一层递归给你返回的地址就可以了。
 
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
BTNode *ret = NULL;
if (root == NULL)
return root;
if (root->_data == x)
return root;
else
{
ret = BTreeFind(root->_left, x);
if (ret != NULL)
{
if (ret->_data == x)
return ret;
}
ret = BTreeFind(root->_right, x);
}
return ret;
}


写了之后有一系列的bug,很多时候ret都是空你是不能访问他的data的,导致调试了很多次才改成了现在一个目前没有bug的程序,用ret来接受你上一层递归的返回值,来进行判断,如果当前返回值已经等于你要找的数值的话,那就继续返回这个返回值。但是一定要注意,在判断ret的数据是不是你要找的数据之前一定要判断一下你的ret当前是不是空,如果是的话不判断继续进行访问就会出现内存出错问题。个人认为这个函数还是需要动一些脑子来仔细思考一下各种情况的。
 
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Hanani_Jia/article/details/79974475
上一篇二叉树的层序遍历
下一篇C语言光标移动函数
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭