【LeetCode】二叉树的深度(最大深度,最小深度, 完全二叉树的节点个数,平衡二叉树)

    科技2022-09-02  133

    前序遍历和后序遍历的代码区别

    前序的递归函数的 返回值为空;参数部分含有结果值;return;后续的递归函数的 返回值为求值的类型; 参数部分不含有结构值; return 类型+1;

    104. 二叉树的最大深度

    给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7]3 / \ 9 20 / \ 15 7 返回它的最大深度 3

    递归法思路:求最大深度,应该是前序遍历,但是最大深度也可以是高度,因此用后序遍历也可以

    int maxDepth(TreeNode* root){ if(root==NULL) return 0; return getDepth(root); } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; int leftdepth=getDepth(cur->left); int rightdepth=getDepth(cur->right); return max(leftdepth,rightdepth)+1; }

    迭代法思路:层序遍历最适合,因为遍历的次数就是层数就是最大深度

    int maxDepth(TreeNode* root) {//层序遍历 queue<TreeNode*> que; int depth=0; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); depth++; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); } } return depth; }

    559. N叉树的最大深度

    给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 例如,给定一个 3叉树 : 我们应返回其最大深度,3int maxDepth(Node* root) {//层序遍历 queue<Node*> que; int depth=0; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); depth++; for(int i=0;i<size;i++){ Node* cur=que.front(); que.pop(); for(int j=0;j<cur->children.size();j++){ if(cur->children[j]) que.push(cur->children[j]); } } } return depth; } int maxDepth(Node* root) {//递归 return getmax(root); } int getmax(Node* node){ if(node==NULL) return 0; int depth=0; for(int i=0;i<node->children.size();i++){ depth=max(depth,getmax(node->children[i])); } return depth+1; }

    111. 二叉树的最小深度

    给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7

    迭代思路:比较好想的是用层序遍历来遍历结点,判断每一个结点是不是叶结点,如果是叶结点,那么就结束遍历,当前层数就是最小深度

    int minDepth(TreeNode* root) { int depth=0; queue<TreeNode*> que; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); depth++; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); if(cur->left==NULL&&cur->right==NULL) return depth; } } return depth; }

    递归思路:和求最大深度的思路相似,但是需要注意的地方在于,当根结点的左结点或者右结点为空的时候,min()为0,但其实最小深度不为0,而是另外一个子树的最小深度。 错误:

    int minDepth(TreeNode* root) { } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; int left=getDepth(cur->left); int right=grtDepth(cur->right); return min(left,right)+1; }

    正确:

    int minDepth(TreeNode* root) { return getDepth(root); } int getDepth(TreeNode* cur){ if(cur==NULL) return 0; if(cur->left==NULL&&cur->right!=NULL) return 1+getDepth(cut->right); if(cur->right==NULL&&cur->left!=NULL) return 1+getDepth(cut->left); int left=getDepth(cur->left); int right=grtDepth(cur->right); return min(left,right)+1; }

    222. 完全二叉树的节点个数

    给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6

    递归思路:左边结点个数加上右边结点个数

    class Solution1 {//递归 public: int countNodes(TreeNode* root) { return getNodeNum(root); } int getNodeNum(TreeNode* root){ if(root==NULL) return 0; int leftNum=getNodeNum(root->left); int rightNum=getNodeNum(root->right); return leftNum+rightNum+1; } };

    迭代思路;层序遍历统计每层个数

    class Solution {//迭代 public: int countNodes(TreeNode* root) { int num=0; queue<TreeNode*> que; if(root!=NULL) que.push(root); while(!que.empty()){ int size=que.size(); num+=size; for(int i=0;i<size;i++){ TreeNode* cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); } } return num; } };

    110. 平衡二叉树

    给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false

    递归思路:比较每一个结点的高度,显然用后序遍历,比较当前结点的左右子树的最大高度,大于1则不平衡 不容易想到的一点是,如果差大于1就不应返回高度,而是返回一个不可能的值,主函数判断是不是这个值,如果是则就返回false;

    bool isBalanced(TreeNode* root) { if(root==NULL) return true; return getdiff(root)==-1?false:true; } int getdiff(TreeNode* cur){ if(cur==NULL) return 0; int left=getdiff(cur->left); if(left==-1){return -1;} int right=getdiff(cur->rigth); if(right==-1){return -1;} //当结点的差不为1时,就不用返回高度了; return abs(left-right)>1?-1:max(left,right)+1; }
    Processed: 0.009, SQL: 9