222. 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
C++递归实现:
/**
* 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 getNumber(TreeNode* root){
if(root==NULL)
{
return 0;
}
int leftNumber=getNumber(root->left);
int rightNumber=getNumber(root->right);
return leftNumber+rightNumber+1;
}
int countNodes(TreeNode* root) {
return getNumber(root);
}
};
C++非递归实现:
/**
* 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 result=0;
queue<TreeNode*> que;
if(root==NULL)
{
return 0;
}
que.push(root);
while(!que.empty())
{
int size=que.size();
for(int i=0;i<size;i++)
{
TreeNode* node=que.front();
que.pop();
result++;
if(node->left)
{
que.push(node->left);
}
if(node->right)
{
que.push(node->right);
}
}
}
return result;
}
};
110. 平衡二叉树
题述:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例 1:
输入:root = [1,2,3,4,5,6]
输出:6
示例 2:
输入:root = []
输出:0
示例 3:
输入:root = [1]
输出:1
C++递归:
/**
* 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 getHeight(TreeNode* cur){
if(cur==NULL)
{
return 0;
}
int leftHeight=getHeight(cur->left);
if(leftHeight==-1)
{
return -1;
}
int rightHeight=getHeight(cur->right);
if(rightHeight==-1)
{
return -1;
}
return abs(leftHeight-rightHeight)>1?-1:1+max(leftHeight,rightHeight);
}
bool isBalanced(TreeNode* root) {
return getHeight(root)==-1?false:true;
}
};
257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
C++回溯实现:
/**
* 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:
void traversal(TreeNode* cur,vector<int>& path,vector<string>& result){
path.push_back(cur->val);
if(cur->left==nullptr && cur->right==nullptr)
{
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);
}
if(cur->left)
{
traversal(cur->left,path,result);
path.pop_back(); //回溯
}
if(cur->right)
{
traversal(cur->right,path,result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if(root==NULL)
{
return result;
}
traversal(root,path,result);
return result;
}
};
100. 相同的树
题述:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2:
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2]
输出:false
C++递归实现:
/**
* 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:
bool compare(TreeNode* tree1,TreeNode* tree2){
if(tree1==NULL && tree2==NULL)
{
return true;
}
if(tree1==NULL && tree2!=NULL)
{
return false;
}
if(tree1!=NULL && tree2==NULL)
{
return false;
}
if(tree1->val!=tree2->val)
{
return false;
}
return compare(tree1->left,tree2->left) && compare(tree1->right,tree2->right);
}
bool isSameTree(TreeNode* p, TreeNode* q) {
return compare(q,p);
}
};
572. 另一棵树的子树
题述:
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
C++递归代码如下:
/**
* 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:
bool compare(TreeNode* tree1,TreeNode* tree2){
if(tree1==NULL && tree2==NULL)
{
return true;
}
if(tree1==NULL && tree2!=NULL)
{
return false;
}
if(tree1!=NULL && tree2==NULL)
{
return false;
}
if(tree1->val!=tree2->val)
{
return false;
}
return compare(tree1->left,tree2->left) && compare(tree1->right,tree2->right);
}
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root==NULL)
{
return false;
}
return compare(root,subRoot) || isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
};
101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
C++递归代码如下:
/**
* 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:
bool compare(TreeNode* leftNode,TreeNode* rightNode)
{
if(leftNode!=NULL && rightNode==NULL)
{
return false;
}
else if(leftNode==NULL && rightNode!=NULL)
{
return false;
}
else if(leftNode==NULL && rightNode==NULL)
{
return true;
}
else if(leftNode->val!=rightNode->val)
{
return false;
}
else
{
return compare(leftNode->left,rightNode->right) && compare(leftNode->right,rightNode->left);
}
}
bool isSymmetric(TreeNode* root) {
if(root==NULL)
{
return true;
}
return compare(root->left,root->right);
}
};