原二叉树

镜像二叉树

采用后序遍历,自底向上进行值的交换
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
TreeNode* Mirror(TreeNode* pRoot) {
// write code here
if(pRoot==NULL)
return NULL;
TreeNode*left=Mirror(pRoot->left),
*right=Mirror(pRoot->right);//递归子树
pRoot->left=right;//交换
pRoot->right=left;
return pRoot;
}
};
时间复杂度:O(n),访问二叉树所有节点
空间复杂度:O(n),递归栈最大深度为n
栈是自顶向下访问
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot TreeNode类
* @return TreeNode类
*/
TreeNode* Mirror(TreeNode* pRoot) {
// write code here
if(pRoot==NULL)
return NULL;
stack<TreeNode*>s;
s.push(pRoot);
while(!s.empty())
{
TreeNode*tmp=s.top();
s.pop();
if(tmp->left)//左右子节点不为空入
s.push(tmp->left);
if(tmp->right)
s.push(tmp->right);
swap(tmp->left,tmp->right);//交换左右系欸但
}
return pRoot;
}
};
时间复杂度:O(n),访问二叉树所有节点
空间复杂度:O(n),最坏情况下栈的大小为n
二叉搜索树是每个左子树节点值小于根节点,每个右子树节点大于根节点,中序遍历即为递增顺序
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
long pre=INT_MIN;
bool isValidBST(TreeNode* root) {
// write code here
if(root==NULL)
return true;
if(!isValidBST(root->left))//先进左子树
return false;
if(root->val<=pre)
return false;
pre=root->val;//更新节点值
if(!isValidBST(root->right))//再进右子树
return false;
return true;
}
};
时间复杂度:O(n),n为二叉树节点数,遍历整个二叉树
空间复杂度:O(n),最坏情况二叉树退化为链表,递归栈深度为n
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isValidBST(TreeNode* root) {
// write code here
stack<TreeNode*>s;
TreeNode*head=root;
vector<int>v;
while(head!=NULL||!s.empty())
{
while(head!=NULL)//直到无左节点
{
s.push(head);
head=head->left;
}
head=s.top();
s.pop();
v.push_back(head->val);
head=head->right;
}
for(int i=1;i<v.size();i++)
{
if(v[i-1]>v[i])//存在降序,则不是搜索树
return false;
}
return true;
}
};
时间复杂度:O(n),二叉树节点数n
空间复杂度:O(n),辅助栈及辅助空间
完全二叉树指叶子节点只能出现在最下层或次下层
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isCompleteTree(TreeNode* root) {
// write code here
if(root==NULL)
return true;
queue<TreeNode*>q;
q.push(root);
bool flag=false;
while(!q.empty())
{
int n=q.size();
for(int i=0;i<n;i++)
{
TreeNode*node=q.front();
q.pop();
if(node==NULL)//标记第一次遇到空节点
flag=true;
else//后续访问已遇到空节点,说明经过了叶子,若还存在非空节点,直接返回false
{
if(flag)
return false;
q.push(node->left);
q.push(node->right);
}
}
}
return true;
}
};
时间复杂度:O(n),其中n为二叉树节点数,层次遍历最坏情况下遍历每一个节点
空间复杂度:O(n),最坏情况下,层次队列的最大空间为O(n)
平衡二叉树任意节点两边子树深度相差不超过1
class Solution {
public:
int depth(TreeNode*root)
{
if(root==NULL)
return 0;
int left=depth(root->left),//递归算出左右子树深度
right=depth(root->right);
return max(left,right)+1;//取最大值+1
}
bool IsBalanced_Solution(TreeNode* pRoot) {
if(pRoot==NULL)
return true;
int left=depth(pRoot->left),
right=depth(pRoot->right);
if(abs(left-right)>1)//深度差值大于一不为平衡树
return false;
return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
//在对左右子树递归判断
}
};
时间复杂度:O(n^2),两个递归最深都为n
空间复杂度:O(n),递归栈最大深度
自顶向上存在弊端,时间复杂度较高,自底向上可同时完成深度计算与判断
class Solution {
public:
bool Judge(TreeNode*root,int&depth)
{
if(root==NULL)
{
depth=0;
return true;
}
int left=0,right=0;
if(Judge(root->left, left)==false||
Judge(root->right, right)==false)//左右子树判断
return false;
if(abs(left-right)>1)//判断
return false;
depth=max(left,right)+1;
return true;
}
bool IsBalanced_Solution(TreeNode* pRoot) {
int depth=0;
return Judge(pRoot,depth);
}
};
时间复杂度:O(n),递归n个节点
空间复杂度:O(n),递归栈深度