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

原创 2018年04月17日 14:34:51

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

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

数据结构基础系列(6):树和二叉树

-
  • 1970年01月01日 08:00

面试题 25:二叉树中和为某一值的路径

题目描述:给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径。一个有效的路径,指的是从根节点到叶节点的路径。...
  • Monster_Girl
  • Monster_Girl
  • 2017-09-05 18:32:05
  • 572

二叉树的最大结点

二叉树的最大结点
  • wx20153724
  • wx20153724
  • 2017-04-08 10:59:35
  • 639

LintCode-二叉树的最大节点

题目描述:在二叉树中寻找值最大的节点并返回。 样例: 给出如下一棵二叉树: 1 / \ -5 2 / \ / \ 0 3 -4 -5 ...
  • yaomf
  • yaomf
  • 2017-04-08 23:47:00
  • 2851

查找二叉树最大值节点

如题 : 在二叉树中查找最大值的节点并返回 测试数据 : {1,-5,3,1,2,-4,-5} 答案 : 3 思路 : 从根节点往下分别查找左子树和右子树的最大节点,再比较左子树,右子树,根节点...
  • W_ILU
  • W_ILU
  • 2017-07-29 12:03:03
  • 791

lintcode 二叉树的最大节点

1:问题描述:在二叉树中寻找值最大的节点并返回 2:思路:用中间结点保存每一次递归时比较的取得最大值的节点。 3:解题代码: /**  * Definition of TreeNode:  ...
  • wangyukl
  • wangyukl
  • 2017-04-09 00:32:45
  • 1079

java 二叉树(四)求二叉树的深度和节点总数

1.判断根节点是否为空 2.递归获取左子树的深度 3.递归获取右子树的深度 public int hight(Node node){ if(node==null){ return 0;...
  • Sun_Ru
  • Sun_Ru
  • 2016-07-06 16:44:03
  • 1862

lintcode(632)二叉树的最大节点

描述: 在二叉树中寻找值最大的节点并返回。 样例; 给出如下一棵二叉树: 1 / \ -5 2 / \ / \ 0 3 -4 -5 ...
  • sunday0904
  • sunday0904
  • 2017-05-03 21:01:52
  • 1641

求二叉树中节点的差的最大值

写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差 最大的两个节点间的差值绝对值。请注意程序效率。...
  • zzmgood
  • zzmgood
  • 2014-08-29 20:59:15
  • 513

求二叉树中结点的最大值(所有结点的值都是正整数)

#include #define N 63 using namespace std; char str[] = "ab#d##a#e##"; int i = -1; typedef struct...
  • stpeace
  • stpeace
  • 2012-11-13 16:14:23
  • 5150
收藏助手
不良信息举报
您举报文章:求二叉树深度以及寻找二叉树中某一节点值
举报原因:
原因补充:

(最多只允许输入30个字)