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,符合则该节点的高度赋值为上左子树与右子树中较大的高度并加1return 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;//中}
};
/*后序遍历,后序遍历的好处就是,先遍历左子树的子节点,再一级一级返回,在遍历右子树的子节点,在一级一级返回,返回给父节点,父节点在返回给父父节点,这样正好可以从下到上依次统计节点数量*/
//掌握前中后序遍历与层序遍历很重要!!!!