二叉树是一种特殊的树型结构,它的每一个结点最多只有两个子结点。
二叉树根据子结点的不同可以分为:
1.完全二叉树:如果一棵树的高度为h,那么除了第h层外,其它各层的结点数都达到最大值,第h层有叶子结点,并且叶子结点都是从左到右依次排布。
2.满二叉树:除了叶节点外每一个节点都有左右子叶且叶子结点都处在最底层的二叉树。
3.平衡二叉树:又称AVL树,它是一棵二叉排序树,具有这样的性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树都有如下性质:
1.二叉树的第i层最多有2^(i-1)个节点;
2.高度为h的二叉树最后又2^h-1个节点;
3.任意一棵二叉树上,其叶子节点个数比度为2的节点数多1。
二叉树的访问方式:
1.先序遍历:对于每个结点,先访问当前结点,然后访问结点的左子树,最后访问结点的右子树。
2.中序遍历:对于每个结点,先访问结点的左子树,然后访问当前结点,最后访问结点的右子树。
3.后序遍历:对于每个结点,先访问结点的左子树,然后访问当前结点的右子树,最后访问当前结点。
实现代码:
#include<iostream>
using namespace std;
class Node {
public:
int data;
Node *lchild, *rchild;
Node(int _data) {
data = _data;
lchild = NULL;
rchild = NULL;
}
~Node() {
if (lchild != NULL) {
delete lchild;
}
if (rchild != NULL) {
delete rchild;
}
}
void preorder() { //先序遍历
cout << data << " ";
if (lchild != NULL) {
lchild->preorder();
}
if (rchild != NULL) {
rchild->preorder();
}
}
void inorder() { //中序遍历
if (lchild != NULL) {
lchild->inorder();
}
cout << data << " ";
if (rchild != NULL) {
rchild->inorder();
}
}
void postorder() //后序遍历
{
if(lchild!=NULL)
{
lchild->postorder();
}
if(rchild!=NULL)
{
rchild->postorder();
}
cout<<data<<" ";
}
};
class BinaryTree {
private:
Node *root;
public:
BinaryTree() {
root = NULL;
}
~BinaryTree() {
if (root != NULL) {
delete root;
}
}
void build_demo() {
root = new Node(1);
root->lchild = new Node(2);
root->rchild = new Node(3);
root->lchild->lchild = new Node(4);
root->lchild->rchild = new Node(5);
root->rchild->rchild = new Node(6);
}
void preorder() {
root->preorder();
}
void inorder() {
root->inorder();
}
void postorder()
{
root->postorder();
}
};
int main() {
BinaryTree binarytree;
binarytree.build_demo();
binarytree.preorder();
cout << endl;
binarytree.inorder();
cout << endl;
binarytree.postorder();
cout << endl;
return 0;
}
还有一种复杂的二叉树叫线索二叉树,后面再补上。