DAY19
104二叉树的最大深度
根节点的高度就是最大深度。
非递归法:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int maxDepth(TreeNode* root) {
- queue<TreeNode*> que;
- int md=0;
- if(root!=nullptr) que.push(root);
- while(!que.empty())
- {
- md++;
- int size=que.size();
- for(int i=0;i<size;i++)
- {
- TreeNode* node=que.front();
- que.pop();
- if(node->left) que.push(node->left);
- if(node->right) que.push(node->right);
- }
- }
- return md;
- }
- };
递归法:
核心:
- class Solution {
- public:
- int getdepth(TreeNode* node) {
- if (node == NULL) return 0;
- int leftdepth = getdepth(node->left); // 左
- int rightdepth = getdepth(node->right); // 右
- int depth = 1 + max(leftdepth, rightdepth); // 中
- return depth;
- }
- int maxDepth(TreeNode* root) {
- return getdepth(root);
- }
- };
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int geth(TreeNode* root)
- {
- if(root==nullptr) return 0;//叶子之下的,高度为0
- return 1+max(geth(root->left),geth(root->right));
- }
- int maxDepth(TreeNode* root) {
- return geth(root);
- }
- };
559 n叉树的最大深度
递归,非递归写过了,不写了:
- /*
- // Definition for a Node.
- class Node {
- public:
- int val;
- vector<Node*> children;
- Node() {}
- Node(int _val) {
- val = _val;
- }
- Node(int _val, vector<Node*> _children) {
- val = _val;
- children = _children;
- }
- };
- */
- class Solution {
- public:
- int maxDepth(Node* root) {
- if(root==nullptr) return 0;
- int depth=0;
- for(int i=0;i<root->children.size();i++)
- {
- depth=max(depth,maxDepth(root->children[i]));
- }
- return depth+1;
- }
- };
111二叉树的最小深度
非递归法:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int minDepth(TreeNode* root) {
- int ld=0;
- queue<TreeNode*> que;
- if(root!=nullptr) que.push(root);
- while(!que.empty())
- {
- int size=que.size();
- ld++;
- for(int i=0;i<size;i++)
- {
- TreeNode* node=que.front();
- que.pop();
- if(node->left) que.push(node->left);
- if(node->right) que.push(node->right);
- if(node->left==nullptr&&node->right==nullptr) return ld;
- }
- }
- return ld;
- }
- };
递归法:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- //后序遍历
- int getd(TreeNode* root)
- {
- if(root==nullptr) return 0;
- int leftd=getd(root->left);
- int rightd=getd(root->right);
- //中
- if(root->left==nullptr&&root->right!=nullptr) return 1+rightd;
- if(root->left!=nullptr&&root->right==nullptr) return 1+leftd;
- return 1+min(leftd,rightd);
- }
- int minDepth(TreeNode* root) {
- return getd(root);
- }
- };
222完全二叉树的节点个数
层序遍历法:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int countNodes(TreeNode* root) {
- int res=0;
- queue<TreeNode*> que;
- if(root!=nullptr) que.push(root);
- while(!que.empty())
- {
- int size=que.size();
- res+=size;
- for(int i=0;i<size;i++)
- {
- TreeNode* node=que.front();
- que.pop();
- if(node->left) que.push(node->left);
- if(node->right) que.push(node->right);
- }
- }
- return res;
- }
- };
递归法:
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int countNodes(TreeNode* root) {
- if(root==nullptr) return 0;
- return 1+countNodes(root->left)+countNodes(root->right);
- }
- };
从完全二叉树的定义入手:
来自代码随想录:
完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。
对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。
对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。
可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。
在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,就说明是满二叉树。
代码;
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode() : val(0), left(nullptr), right(nullptr) {}
- * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
- * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
- * };
- */
- class Solution {
- public:
- int fulltree(TreeNode* root)
- {
- if(root==nullptr) return 0;
- TreeNode* left=root->left;
- TreeNode* right=root->right;
- int leftdepth=0,rightdepth=0;
- //求左子树深度
- while(left)
- {
- left=left->left;
- leftdepth++;
- }
- while(right)
- {
- right=right->right;
- rightdepth++;
- }
- if(leftdepth==rightdepth) return (2<<leftdepth)-1;
- //如果没找到满二叉树,就继续向左向右递归(后序遍历)+1表示中节点
- return fulltree(root->left)+fulltree(root->right)+1;
- }
- int countNodes(TreeNode* root) {
- return fulltree(root);
- }
- };
总结
深度:任意节点与根节点的距离(从1开始,也就是:根节点深度是1);用前序遍历来求,
高度:任意节点到叶子节点的距离。用后序遍历来求。(找叶子:要把孩子的信息返回给节点,所以用后序遍历)。根节点的高度就是二叉树的最大深度。
记忆:深根(前序) 高叶(后序)
写前序是比较麻烦的。一般写后序了。