4_1二叉树的最大深度
给定一个二叉树 root
,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
Answer-
方法一:深度优先递归
核心 :
n1 = maxdep(dp->left);
n2 = maxdep(dp->right);
return (n1>n2 ? n1:n2) + 1;
方法二:广度优先遍历
核心 :一边pop一边push,怎么知道要pop多少个呢?用一个int size;来记录上一层应该出多少个元素。pop上层元素前先记录该层总个数size,出一个则size--,一边出一边加其左右孩子,就解决了。总体思想是每次只让队列保留当前层的所有节点。
学会了:
C++队列的使用
//导入
include "queue.h"
//声明
queue<datatype> queue_name;
//加入
queue_name.push(value);
//弹出-和stack一样不返回元素仅仅弹出
queue.pop;
//获取front指向元素
queue.front();
//判空
queue.empty();
4_2 给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
My-中序遍历+队列,直接中序遍历并将值记录到队列中,再出队列逐个判断是否是逐步递增的,不是返回false;
Answer-
方法一:递归,分别对左右子树递归,每次更新边界范围,不符合范围直接返回false
核心:
return help(root->left,lower,root->val) && help(root->right,root->val,upper)
方法二:中序遍历+per指针,一边中序遍历一边比较是否比pre->val大 ,否则返回false.
4_3对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
My-左右分别遍历并记录遍历的val于队列中,逐个出队对比判断 --太拉了不实现了
Answer-
方法一:递归,即两个指针p,q分别一个向左一个向右,再一个向右一个向左。
核心:
bool check(TreeNode *p,TreeNode *q)
{
if(!p && !q)
return true;
if(!p || !q || p->val != q->val)
return false;
return check(p->left,q->right) && check(p->right,q->left);
}
方法二:迭代,一次入队两个,一次出队两个,入队时一个入左,一个入右,再一个入右一个入左。每次一次出队两个应该相等,不然不是对称的树。
注意:队列存储类型应该为TreeNode *指针类型。