剑指offer第二、三天
class Solution {
int get_height(TreeNode* node)
{
if(node == nullptr)return 0;
else return 1 + max(get_height(node->left),get_height(node->right));
}
public:
int treeDepth(TreeNode* root) {
return get_height(root);
}
};
class Solution {
void dfs(TreeNode* node,vector<TreeNode*>&ans)
{
if(node->left)dfs(node->left,ans);
ans.push_back(node);
if(node->right)dfs(node->right,ans);
}
public:
TreeNode* kthNode(TreeNode* root, int k) {
vector<TreeNode*>ans;
dfs(root,ans);
return ans[k-1];
}
};
class Solution {
TreeNode* traversal(vector<int>&preorder,vector<int>&inorder)
{
if(preorder.size() == 0)return nullptr;
int rootvalue = preorder[0];
TreeNode* root = new TreeNode(rootvalue);
if(preorder.size() == 1)return root;
int idx;
for(idx = 0;idx<inorder.size();++idx)
if(inorder[idx] == rootvalue)
break;
vector<int>leftInorder(inorder.begin(),inorder.begin()+idx);
vector<int>rightInorder(inorder.begin()+idx+1,inorder.end());
vector<int>leftPreorder(preorder.begin()+1,preorder.begin()+1+leftInorder.size());
vector<int>rightPreorder(preorder.begin()+1+leftInorder.size(),preorder.end());
root->left = traversal(leftPreorder,leftInorder);
root->right = traversal(rightPreorder,rightInorder);
return root;
}
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.size() == 0)return nullptr;
return traversal(preorder,inorder);
}
};
class solution {
bool isSame(TreeNode*s,TreeNode*t)
{
if(s==nullptr && t!=nullptr)return false;
if(s==nullptr && t==nullptr)return true;
if(s!=nullptr && t==nullptr)return true;
return s->val==t->val
&&isSame(s->left,t->left)
&&isSame(s->right,t->right);
}
public:
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(pRoot2==nullptr)return false;
if(pRoot1==nullptr)return false;
return isSame(pRoot1,pRoot2)
||hasSubtree(pRoot1->left,pRoot2)
||hasSubtree(pRoot1->right,pRoot2);
}
};
class Solution {
void postorder(TreeNode* node)
{
if(node == nullptr)return;
postorder(node->left);
postorder(node->right);
swap(node->left,node->right);
}
public:
void mirror(TreeNode* root) {
postorder(root);
}
};
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int>ans;
if(root == nullptr)return ans;
queue<TreeNode*>que;
que.push(root);
while(!que.empty())
{
auto t = que.front();
que.pop();
ans.push_back(t->val);
if(t->left)
que.push(t->left);
if(t->right)
que.push(t->right);
}
return ans;
}
};
class Solution {
private:
bool check(vector<int>&sequence,int l,int r)
{
if(l>=r)return true;
int j = r-1,root = sequence[r];
while(j>=0 && sequence[j] > root)j--;
for(int i = l;i<=j;++i)
{
if(sequence[i] > root)return false;
}
return check(sequence,l,j)&&check(sequence,j+1,r-1);
}
public:
bool VerifySquenceOfBST(vector<int> sequence) {
int n = sequence.size();
if(n == 0)return false;
return check(sequence,0,n-1);
}
};
class Solution {
void inorder(TreeNode* node,TreeNode* & first,TreeNode* & last)
{
if(node==nullptr)return;
inorder(node->left,first,last);
if(last)
{
last->right = node;
node->left = last;
}
else{
first = node;
}
last = node;
inorder(node->right,first,last);
}
public:
TreeNode* Convert(TreeNode* root) {
TreeNode*first,*last;
first = last = nullptr;
inorder(root,first,last);
return first;
}
};
class Solution {
public:
int get_height(TreeNode* node) {
if (node == nullptr)return 0;
else
return max(get_height(node->left), get_height(node->right)) + 1;
}
bool is_balanced(TreeNode* node) {
if (node == nullptr)return true;
return is_balanced(node->left)&&is_balanced(node->right)&&abs(get_height(node->left) - get_height(node->right)) <= 1;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
return is_balanced(pRoot);
}
};