二叉树定义
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树 。
二叉树的性质
性质2:深度为h的二叉树中至多含有2h-1个节点 。
性质3:若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1 。
性质4:具有n个节点的满二叉树深为log2n+1。
性质5:若对一棵有n个节点的完全二叉树进行顺序编号(1≤i≤n),那么,对于编号为i(i≥1)的节点: 当i=1时,该节点为根,它无双亲节点 。
当i>1时,该节点的双亲节点的编号为i/2。
若2i≤n,则有编号为2i的左节点,否则没有左节点 。
若2i+1≤n,则有编号为2i+1的右节点,否则没有右节点 。
二叉树的五种形态
1.空二叉树
2.只有一个根节点的二叉树
3.只有左子树
4.只有右子树
5.完全二叉树
二叉树三种特殊形态
1.满二叉树
如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树。满二叉树是完全二叉树的特殊形状。
2.完全二叉树
深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。
代码描述
首先创建树和节点的类
class Node
{
public:
Node():m_left(NULL),m_right(NULL),m_value(NULL){}
Node(char v):m_value(v), m_left(NULL), m_right(NULL){}
char m_value;
Node* m_left;
Node* m_right;
};
class Tree
{
public:
Tree() :m_root(NULL) {}
Node* m_root;
Node* CreateFirst(const char*& str);
void PrintMiddle(Node* t);
void PrintTree(Node* t);
void PrintFinally(Node* t);
};
先序遍历创建二叉树(递归)
Node* Tree::CreateFirst(const char*& str)
{
if (*str == '#')
return nullptr;
else
{
Node* root = new Node(*str);
root->m_left = CreateFirst(++str);
root->m_right = CreateFirst(++str);
return root;
}
}
前序遍历二叉树(根左右)
void Tree::PrintTree(Node* t)
{
if (t)
{
cout << t->m_value << " ";
PrintTree(t->m_left);
PrintTree(t->m_right);
}
}
中序遍历二叉树(左根右)
void Tree::PrintMiddle(Node* t)
{
if (t)
{
PrintMiddle(t->m_left);
cout << t->m_value << " ";
PrintMiddle(t->m_right);
}
}
后序遍历二叉树(左右根)
void Tree::PrintFinally(Node* t)
{
if (t)
{
PrintFinally(t->m_left);
PrintFinally(t->m_right);
cout << t->m_value << " ";
}
}
int main()
{
Tree t;
const char* str = "ABDG##HI####CE#J##F##";
const char* vlr = "abdecfg";
const char* lvr = "dbeafcg";
const char* lrv = "debfgca";
t.m_root = t.CreateFirst(str);//创建
cout << "先序遍历:";
t.PrintTree(t.m_root);
cout << endl;
cout << "中序遍历:";
t.PrintMiddle(t.m_root);
cout << endl;
cout << "后序遍历:";
t.PrintFinally(t.m_root);
cout << endl;
}