首页 > 编程语言 >代码随想录算法训练营第十五天| 110.平衡二叉树 (优先掌握递归) 257. 二叉树的所有路径 (优先掌握递归) 404.左叶子之和 (优先掌握递归)

代码随想录算法训练营第十五天| 110.平衡二叉树 (优先掌握递归) 257. 二叉树的所有路径 (优先掌握递归) 404.左叶子之和 (优先掌握递归)

时间:2023-06-23 15:55:08浏览次数:46  
标签:优先 return cur 递归 int selected _- result 二叉树

 110.平衡二叉树 (优先掌握递归)

难点:

要求每个节点的左右字数的高度相减<=1,因此,需要对每个节点都进行检查,难就难在怎么获得任意节点的高度

其中递归是最简单的:

 

 1 int isB_cursor(TreeNode* node, bool &isBalance)
 2 {
 3     if (isBalance == false) return 0;
 4     if (!node) return 0;
 5     
 6     int leftLength = isB_cursor(node->left, isBalance);
 7     int rightLength = isB_cursor(node->right, isBalance);
 8 
 9     if (abs(leftLength - rightLength) > 1)
10     {
11         isBalance = false;
12     }
13 
14     return 1 + max(leftLength, rightLength);
15 }
16 bool isBalanced_cursor(TreeNode* root) {
17     bool result = true;
18     if (!root) return result;
19     isB_cursor(root, result);
20 
21     return result;
22 }

迭代法,很难

有两个方案获得任意节点的高度,一个是使用层序遍历

另一个很难,先弹出去当前节点,然后在押入,同时压进去左右孩子,类似一路到底,然后在回溯,回溯的时候-1,

用NULL来分开当前节点和左右孩子的分界线:

代码:

 1 int getMaxHeight(TreeNode* node)
 2 {
 3     if (!node) return 0;
 4 
 5     int result = 0;
 6     int depth = 0;
 7     stack<TreeNode*> selected;
 8     selected.push(node);
 9     while (!selected.empty())
10     {
11         TreeNode* cur_ = selected.top();
12         selected.pop();
13         if (cur_)
14         {
15             //先把自己压进去,然后压进去左右孩子,
16             selected.push(cur_);
17             selected.push(NULL);//代表是下一个了
18 
19             if (cur_->left) selected.push(cur_->left);
20             if (cur_->right)selected.push(cur_->right);
21 
22             depth++;
23         }
24         else
25         {
26             selected.pop();
27             depth--;
28         }
29         result = result > depth ? result : depth;
30     }
31 
32     return result;
33 }
34 
35 //先看每一个节点
36 bool isBalanced(TreeNode* root) {
37     bool result = true;
38     if (!root) return result;
39 
40     stack<TreeNode*> selected;
41     selected.push(root);
42 
43     while (!selected.empty())
44     {
45         auto cur_ = selected.top();
46         selected.pop();
47 
48         int leftLength = getMaxHeight(cur_->left);
49         int rightLength = getMaxHeight(cur_->right);
50 
51         if (abs(leftLength - rightLength) > 1)
52             return false;
53 
54         if (cur_->left) selected.push(cur_->left);
55         if (cur_->right) selected.push(cur_->right);
56     }
57 
58     return result;
59 }

 

 

标签:优先,return,cur,递归,int,selected,_-,result,二叉树
From: https://www.cnblogs.com/smartisn/p/17499231.html

相关文章

  • Android-Kotlin-递归与尾递归
    递归:阶乘计算:/***阶乘:*1的阶乘是1,因为1往下走一个楼梯就是0了*2的阶乘是2*1*3的继承是3*2*1*4的继承是4*3*2*1*5的阶乘是5*4*2*1*/packagecn.kotlin.kotlin_base06......
  • 二分查找法upper版(找大于某个值的最小下标)递归+非递归版
    需求:比如说查询一个班级大于60分的最低分等等。思路与二分法基本相同,只不过是对比的逻辑发生了一些小变化,这里所说的上界就是指大于某个值的最小下标。当mid<target:说明target的上界还在mid的右边,所以要去找比mid大的当mid>target:说明mid有可能是target的上界,所以......
  • 代码随想录算法训练营第十四天| 104.二叉树的最大深度 (优先掌握递归) 111.二叉树的最小
    104.二叉树的最大深度(优先掌握递归)迭代法,上一篇已经讲过,只需要对每一层+1,这里重要些递归法递归法注意:如果当前节点为NULL,返回0,不是NULL,那么就是1+max(right,left)代码:1voidmaxD_cursor(TreeNode*node,int&result)2{3if(!node)return;45result......
  • 交换二叉树
    #include<stdio.h>#include<stdlib.h>#include<malloc.h>typedefstructBTNode{ chardata; structBTNode*lchild; structBTNode*rchild;}*BiTree;voidcreateBiTree(BiTree*t){//此处补充代码,输入二叉树的先序遍历序列建立二叉树 chars;......
  • 20230314 3.2. 二叉树
    二叉树的定义二叉树T:一个有穷的结点集合。这个集合可以为空若不为空,则它是由根结点和称为其左子树TL和右子树TR的两个不相交的二叉树组成。二叉树具体五种基本形态:空二叉树;只有根结点的二叉树;只有根结点和左子树TL的二叉树;只有根结点和右子树TR的二叉树;具有根结点、左......
  • 时间序列转图像:符号递归图(Symbolic recurrence plots)(matlab版复现)
    符号递归图(Symbolicrecurrenceplots):是一种以为时间序列转图像技术,可用于平稳和非平稳数据集;对噪声具有鲁棒性,在一定的数据变换条件下具有不变性。结合深度学习技术可以解决能源电力,水利,天气,生物医学,交通等领域的复杂模式识别和监测任务。链接:https://mbd.pub/o/bread/mbd-ZJqY......
  • 代码随想录算法训练营第十三天| 层序遍历 226.翻转二叉树 (优先掌握递归) 101. 对
    层序遍历注意:1,使用队列的形式,依次入队,同时对队列进行计数2,知道数目消失,才进行下一个队列代码:1vector<vector<int>>levelOrder(TreeNode*root)2{3vector<vector<int>>result;4if(root==NULL)returnresult;5queue<TreeNode*>selected;6......
  • java递归创建目录
    importjava.io.File;publicclassCreateDirectory{publicstaticvoidmain(String[]args){Stringpath="D:\\heap\\d\\c\\e";createDirectory(path);}publicstaticvoidcreateDirectory(Stringpath){......
  • 数据结构和算法系列课程(01)--- 排序二叉树和红黑树
    把排序二叉树放在这个系列课程的第一个部分似乎有些唐突,但是考虑到它在面试中出现的可能性,把它放在这样的一个位置也就不足为奇了。关于树和二叉树的基础知识,可以到下面的链接中下载我的课件进行了解。下面给出一个排序二叉树的Java实现:packagcom.loonstudio;/***排序二叉树......
  • 优先队列和惰性队列
    1.优先队列1.1场景在我们系统中有一个订单催付的场景,我们的客户在天猫下的订单淘宝会及时将订单推送给我们,如果在用户设定的时间内未付款那么就会给用户推送一条短信提醒,很简单的一个功能对吧,但是,tmall商家对我们来说,肯定是要分大客户和小客户的对吧,比如像苹果,小米这样大......