判断树是不是平衡二叉树;
class Solution {
public:
int Length_Tree(TreeNode* tree) //判断左右树的深度
{
if(tree == nullptr)
return 0;
int left = Length_Tree(tree->left);
int right = Length_Tree(tree->right);
return (left >=right ?left:right) + 1;
}
bool isBalanced(TreeNode* root) {
if(root == nullptr) //空树判断
return true;
bool left = isBalanced(root->left); //深入左子树
if(left == false) //如果左子树已经不是二叉树,那这个时候就不需要判断直接返回false
return false;
bool right = isBalanced(root->right); //如果右子树不是,那么右子树也就是可以直接跳出了
if(right == false)
return false;
int left_length = Length_Tree(root->left);//判断左子树的深度
int right_length = Length_Tree(root->right); //判断右子树的深度
int diff = left_length - right_length; //求差值
if(diff <= 1 && diff >= -1) //符合要求就可以返回真,否则返回假
return true;
else
return false;
}
};
将二叉树转换为字符串形式,当左子树为空时右子树不为空的时候,不能省略左子树的()但是可以省略右子树的括号,左右子树都为空的时候可以都省略,左子树不为空,右子树为空时可以省略右子树的();
你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void preAccess(TreeNode* t, string & str)
{
if(t == NULL) return;
str += to_string(t->val); //to_string()将数字转换为字符串
if(t->left || t->right)//代码中的体现就是,左子树不为空,或者右子树不为空的时候左子树+()
{
str += "(";
preAccess(t->left, str);
str += ")";
}
if(t->right) //只有右子树本身 不为空的时候才+()括号中有数据
{
str += "(";
preAccess(t->right, str);
str += ")";
}
}
string tree2str(TreeNode* t) {
string res = "";
preAccess(t, res);
return res;
}
};
二叉树的公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root,TreeNode* p ,TreeNode* q)
{
if (root == p || root == q || !root)return root;
struct TreeNode* left = lowestCommonAncestor(root->left, p, q);
struct TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (!left&&!right)return nullptr;
else if (left&&!right)return left;
else if (right&&!left)return right;
return root;
}