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 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 *指针类型。

你可能感兴趣的:(#,初级算法,算法)