搜索二叉树:一棵树上任何一个节点为头的子数,左子树都比它小,右子树都比它大
只要中序遍历的结果是依次升序的,它就是平衡二叉树
#include<stack>
#include<limits>
using namespace std;
class isBSTAndCBT{
private:
class Node{
public:
int value;
Node *left;
Node *right;
Node(int data){
this->value=data;
}
};
bool isBST(Node *head){
int pre=numeric_limits<int>::min();
if(head!= nullptr){
stack<Node>Stack;
while(!Stack.empty()||head!= nullptr){
if(head!= nullptr){
Stack.push(*head);
head=head->left;
}
else{
head=&Stack.top();
Stack.pop();
if(head->value<pre)
return false;
head=head->right;
}
}
}
return true;
}
};
完全二叉树:当二叉树的深度为h时,它的h层节点必须都是连续靠左并不可隔开的(满二叉树也符合),并且1~h-1层的结点数都达到最大个数(即1~h-1层为一个满二叉树)。
判断是否完全二叉树的方法是按层遍历:
(1)一个节点,如果只有右子树,没有左子树,它一定不是完全二叉树,直接return false
(2)一个节点,如果之有左子树,没有右子树,那它后面的所有节点,都必须是叶节点,否则返回false。
bool isCBT(Node *head){
if(head== nullptr)
return true;
queue<Node>Queue;
bool leaf=false;
Node *l= nullptr;
Node *r= nullptr;
Queue.push(*head);
while(!Queue.empty()){
head=&Queue.front();
l=head->left;
r=head->right;
if((leaf&&(l!= nullptr||r!= nullptr))
||(l== nullptr&&r!= nullptr)){
return false;
}
if(l!= nullptr){
Queue.push(*l);
}
if(r!= nullptr){
Queue.push(*r);
}
else{//if(l==nullptr||r==nullptr)判断叶节点阶段开启
leaf=true;
}
}
return true;
}