满二叉树
定义:高度为h,并且由2{h} –1个结点的二叉树,被称为满二叉树。
完全二叉树
定义:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。这样的二叉树称为完全二叉树。
特点:叶子结点只能出现在最下层和次下层,且最下层的叶子结点集中在树的左部。显然,一棵满二叉树必定是一棵完全二叉树,而完全二叉树未必是满二叉树。
二叉搜索树
定义:在二叉搜索树中,任取一个节点A,A的值不小于它左子树上的任何值、它右子树上的每个值都大于A。
插入节点、删除树
/*二叉搜索树数据类型*/
struct TreeNode
{
int data;
TreeNode* left;
TreeNode* right;
};
/*向二叉搜索树中添加一个节点*/
TreeNode* InsertTree(TreeNode* root, int value){//递归调用,所以要记得返回类型
TreeNode* newNode;
if(root == nullptr){
newNode = new TreeNode;
newNode->data = value;
newNode->left = nullptr;
newNode->right = nullptr;
return newNode;
}
if(value < root->data)
root->left = InsertTree(root->left, value);
if(value > root->data)
root->right = InsertTree(root->right, value);
return root;
}
/*删除二叉树*/
void DeleteTree(TreeNode* root){
if(root->left != nullptr)
DeleteTree(root->left);
if(root->right != nullptr)
DeleteTree(root->right);
delete root;
return;
}
广度优先遍历(BFS)
算法流程:
1. 根节点入队
2. 循环判断当前队列非空,访问队首,出队
3. 如果左子树非空,左子树根节点入队
4. 如果右子树非空,右子树根节点入队
代码:
vector<int> BFS(TreeNode* root){
std::vector<<int> sequence;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* tmp = q.front();
sequence.push_back(tmp->data);
q.pop();
if(tmp->left != nullptr)
q.push(tmp->left);
if(tmp->right != nullptr)
q.push(tmp->right);
}
return sequence;
}
深度优先遍历(DFS)
深度优先遍历。有四种遍历方式:先根,后根,左子树优先,右子树优先
(1)先根顺序遍历:a. 访问根节点 b. 遍历左子树 c. 遍历右子树
(2)后根顺序遍历:a. 遍历左子树 b. 遍历右子树 c. 访问根节点
(3)左子树优先遍历:a. 遍历左子树 b. 访问根节点 c.遍历右子树
(4)右子树优先遍历:a.遍历右子树 b.访问根节点 c.遍历左子树
/*先根遍历代码*/
/*其余遍历方式相似,调换访问顺序即可*/
void FLRTraverse(TreeNode *root){
printf("%d", root->val); //访问根节点
if(root->left != NULL)
FLRTraverse(root->left); //遍历左子树
if(root->right != NULL)
FLRTraverse(root->right); //遍历右子树
}