110平衡二叉树
题目描述
给定一个二叉树,判断它是否是
平衡二叉树
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false
示例 3:
输入:root = [] 输出:true
/*注意迭代的遍历顺序时左右中,后序遍历,因为这样可以依次向上返回高度*/
代码:
class Solution {
public:
int gethigh(TreeNode* Node)
{
//后序遍历,依次向上返回高度!!
if(Node==NULL){return 0;}
//如果左子树高度为-1,就说明该二叉树已经不是平衡二叉树,向上返回-1(左)
int lefthigh=gethigh(Node->left);
if (lefthigh==-1)return -1;
//如果左子树高度为-1,就说明该二叉树已经不是平衡二叉树,向上返回-1(右)
int righthigh=gethigh(Node->right);
if (righthigh==-1)return -1;
//如果左右子树都符合平衡二叉树,则计算该节点的左右子树的高度差的绝对值
//若>1则向上返回-1,符合则该节点的高度赋值为上左子树与右子树中较大的高度并加1
return abs(lefthigh-righthigh)>1?-1:1+max(lefthigh,righthigh);(中)
}
bool isBalanced(TreeNode* root) {
return gethigh(root)==-1?false:true;
}
};
257二叉树的所有路径
题目描述:
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
代码:
/*注意是前序遍历,才可以正确的遍历所有路径;*/
如图:
class Solution {
public:
//前序遍历,遍历的顺序正好是路径(从左到右)
void traversal(TreeNode* root,vector<int> &path,vector<string> &result){
path.push_back(root->val);//(中)
//生成题目要求的答案,因为此时已经到左右子树都为空的时候,路到尽头开始记录答案
if(root->left==NULL&&root->right==NULL)
{
string spath;
for(int i=0;i<path.size()-1;i++)
{
spath +=to_string(path[i]);
spath +="->";
}
spath +=to_string(path[path.size()-1]);
result.push_back(spath);
return;
}
//pop_back()函数可以删除容器中最后面的元素,也就是回溯到上一层,回溯完开始下一个if语句,
向右开始遍历
if(root->left){ //(左)
traversal(root->left,path,result);
path.pop_back();
}
if(root->right){ //(右)
traversal(root->right,path,result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> result;
if(root==NULL) return result;
traversal(root,path,result);
return result;
}
};
404左叶子之和
题目描述:
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
代码:
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==NULL)return 0;
int leftvalue=sumOfLeftLeaves(root->left);//(左)
if(root->left&&!root->left->left&&!root->left->right){
leftvalue=root->left->val;
}
int rightvalue=sumOfLeftLeaves(root->right);//(右)
int sum=rightvalue+leftvalue;//(中)
return sum; //返回子节点(左右两个)的和
}
};
/*注意时后序遍历,这样会是先遍历子节点,然后向父节点返回这个值,每一次遍历左子树与右子树只技艺左叶节点的值,返回的值是左右子树的左叶结点的和*/
222完全二叉树的节点个数
题目描述:
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
示例 1:
输入:root = [1,2,3,4,5,6] 输出:6
示例 2:
输入:root = [] 输出:0
示例 3:
输入:root = [1] 输出:1
class Solution {
public:
int countNodes(TreeNode* root) {
if(root==NULL)return 0;
int leftc=countNodes(root->left);//左
int rightc=countNodes(root->right);//右
return leftc+rightc+1;//中
}
};
/*后序遍历,后序遍历的好处就是,先遍历左子树的子节点,再一级一级返回,在遍历右子树的子节点,在一级一级返回,返回给父节点,父节点在返回给父父节点,这样正好可以从下到上依次统计节点数量*/
//掌握前中后序遍历与层序遍历很重要!!!!