Balanced Binary Tree
int depth(TreeNode* root) {
if (root == NULL)
return 0;
return max(depth(root->left)+1, depth(root->right)+1);
}
void dfs(TreeNode* root, bool &ans) {
if (root == NULL)
return;
if (abs(depth(root->left) - depth(root->right)) > 1)
ans = false;
dfs(root -> left, ans);
dfs(root -> right, ans);
}
bool isBalanced(TreeNode* root) {
bool res = true;
dfs(root, res);
return res;
}
class Solution {
public:
unordered_map<TreeNode*, int> um;
int depth(TreeNode* root) {
if (root == NULL)
return 0;
int res = max(depth(root->left)+1, depth(root->right)+1);
um[root] = res;
return res;
}
void dfs(TreeNode* root, bool &ans) {
if (root == NULL)
return;
if (abs(um[root->left] - um[root->right]) > 1)
ans = false;
dfs(root -> left, ans);
dfs(root -> right, ans);
}
bool isBalanced(TreeNode* root) {
bool res = true;
um[NULL] = 0;
depth(root);
dfs(root, res);
return res;
}
};
int depth(TreeNode* root, bool & ans) {
if (root == NULL)
return 0;
int l = depth(root -> left, ans);
int r = depth(root -> right, ans);
if (abs(l-r)>1)
ans = false;
return max(l+1,r+1);
}
bool isBalanced(TreeNode* root) {
bool ans = true;
depth(root, ans);
return ans;
}
二叉搜索树序列化
//思路一:把每个节点按顺序存储,再连接
void Rcs(TreeNode* root, vector<TreeNode*> &v)
{
if(root == NULL)
return ;
Rcs(root->left,v);
v.push_back(root);
Rcs(root->right,v);
}
TreeNode* Convert(TreeNode* pRoot)
{
if(pRoot == NULL)
return pRoot;
vector<TreeNode*> v;
Rcs(pRoot,v);
for(int i = 0; i < v.size()-1; i++)
{
v[i]->right = v[i+1];
v[i+1]->left = v[i];
}
v.back()->right = NULL;
return v[0];
}
//思路二:每两个节点进行连接
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
TreeNode* pre = nullptr;
convertHelper(pRootOfTree, pre);
TreeNode* res = pRootOfTree;
while(res ->left)
res = res ->left;
return res;
}
void convertHelper(TreeNode* cur, TreeNode*& pre)
{
if(cur == nullptr) return;
convertHelper(cur ->left, pre);
cur ->left = pre;
if(pre) pre ->right = cur;
pre = cur;
convertHelper(cur ->right, pre);
}
对称的二叉树
void rcs(TreeNode* root, vector<TreeNode*> &v)
{
if(root == NULL)
return;
rcs(root->left,v);
v.push_back(root);
rcs(root->right,v);
}
bool isSymmetrical(TreeNode* pRoot)
{
vector<TreeNode*> v;
rcs(pRoot,v);
for(int i = 0, j = v.size()-1; i < j; i++,j--)
{
if(v[i]->val != v[j]->val)
return false;
if(v[i]->left)
{
if(!v[j]->right || v[i]->left->val != v[j]->right->val)
return false;
}
if(v[i]->right)
{
if(!v[j]->left || v[i]->right->val != v[j]->left->val)
return false;
}
}
return true;
}
bool helper(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == NULL && pRoot2 == NULL)
return true;
if(pRoot1 ==NULL || pRoot2 == NULL)
return false;
if(pRoot1->val != pRoot2->val)
return false;
return helper(pRoot1->left,pRoot2->right)&&helper(pRoot1->right,pRoot2->left);
}
bool isSymmetrical(TreeNode* pRoot)
{
if(!pRoot)
return true;
return helper(pRoot,pRoot);
}