二叉树:
每个结点最多有两个子树的结构
二叉树的性质:
1、二叉树的第i层上的节点数目最多为2{i-1},(i>=1
2、深度为k的二叉树至多有2{k}-1个结点(k>=1)
3、包含n个结点的二叉树的高度至少为log2(n+1)
4、在任意一颗二叉树中,若终端结点的个数为n0,
度为2的节点数为n2,则n0=n2+1
满二叉树
每一层的节点都达到了最大值就是满二叉树
完全二叉树
在一颗二叉树中,只有下面的两层结点的度可以小于2并且最下面一层的叶子结点集中在靠左的位置上,这样的二叉树叫做完全二叉树。
二叉查找树:
定义:
二叉查找树中的每一个结点都对应一个唯一的键值,并且每个键大于左子树上任意结点的键,小于右子树上任意结点的键。
二叉查找树特点
1、若任意节点的左子树不空,则左子树上所有节点的值均小于他根节点的值
2、任意节点的右子树不为空,则右子树上所有节点的值均大于他根节点的值。
3、任意结点的左右子树也分别为二叉查找树
4、没有键值相等的结点
创建二叉查找树代码
头文件类
#pragma once
#include<iostream>
#include<vector>
using namespace std;
struct Node
{
int key;
Node* left = nullptr;
Node* right = nullptr;
Node(int key)
{
this->key = key;
}
};
class Tree
{
private:
Node* root = nullptr;
public:
Tree(vector<int> vec);
Node* getroot();
void InorderTree(Node* root);
};
类外实现创建二叉搜索树函数
#include "Tree.h"
Tree::Tree(vector<int> vec)
{
if(root == nullptr) root = new Node(vec[0]);
for(int i = 1; i < vec.size(); i++)
{
Node* p = root;
Node* newnode = new Node(vec[i]);
while(1)
{
if(p->key>vec[i])
{
if(p->left == nullptr)
{
p->left = newnode;
break;
}
p = p->left;
}
else if(p->key < vec[i])
{
if(p->right == nullptr)
{
p->right = newnode;
break;
}
p = p->right;
}
else
{
cout << "不允许出现重复值" << endl;
return;
}
}
}
}
Node* Tree::getroot()
{
return root;
}
void Tree :: InorderTree(Node* root)
{
if(root == nullptr) return;
InorderTree(root->left);
cout << root->key << " ";
InorderTree(root->right);
}
主函数
#include"Tree.h"
int main()
{
vector<int> vec{9,6,11,25,44,33};
Tree t(vec);
Node* p = t.getroot();
t.InorderTree(p);
}