二叉树的定义:是一种树形结构,特点是每个节点最多有两棵子树并且有左右之分
二叉树的五种形态:空树,只有一个根,一个根和一个左子树,一个根和一个右子树,根和左右子树
二叉树的特性:1.第i层最多有2的(i-1)次方个节点
2.深度为h的二叉树最多有2的(h-1)次方个节点
3.对一个完全二叉树进行顺序编号,对于编号为i的结点,i=1,为根;i%2=0说明 有该结点的父节点有一个左子树,i%2>0说明有左右子树
四种遍历方式:先序遍历,中序遍历,后序遍历根据根节点的遍历顺序区分,层序遍历
代码实现:
首先构造两个类,一个二叉树类,一个结点类,列出函数声明
class Node
{
public:
Node() :m_left(nullptr), m_right(nullptr) {}
Node(char v) :m_value(v), m_left(nullptr), m_right(nullptr) {}
char m_value; //节点的值
Node* m_left; //指向左子树的指针
Node* m_right; //指向右子树的指针
};
class Tree
{
public:
Tree() :m_root(NULL) {}
Node* Create1(const char*& str);//1.创建二叉树
void Create(Node*& root, const char*& str);//2.创建二叉树的递归写法
void PreOrder(Node* root);//3.先序遍历
void InOrder(Node* root);//4.中序遍历
void PostOrder(Node* root);//5.后序遍历
int Size(Node* root);//6.求节点个数
int Height(Node* root);//7.求树的深度
Node* Search(Node* root, char v);//8.查找二叉树中是否存在该节点
Node* Parent(Node* root, char v);//9.查找该结点的父亲节点
Node* m_root;//二叉树的根节点
};
1.创建二叉树
Node *Tree::Create1(const char*& str)
{
if(*str=='#')
return nullptr;
else
{
Node* root=new Node(*str);
root->m_left=Create1(++str);
root->m_right=Create1(++str);
return root;
}
}
2.创建二叉树(递归)
void Tree::Create(Node*& root,const char*& str)
{
if(*str=='#')
root=nullptr;
else
{
root =new Node(*str);
Create(root->m_left,++str);
Create(root->m_right,++str);
return root;
}
}
3.先序遍历(根左右)
void Tree::PreOrder(Node* root)
{
if (root != nullptr)
{
cout << root->m_value << " ";
PreOrder(root->m_left);
PreOrder(root->m_right);
}
}
4.中序遍历(左根右)
void Tree::InOrder(Node* root)
{
if (root != nullptr)
{
InOrder(root->m_left);
cout << root->m_value << " ";
InOrder(root->m_right);
}
}
5.后序遍历(左右根)
void Tree::PostOrder(Node* root)
{
if (root != nullptr)
{
PostOrder(root->m_left);
PostOrder(root->m_right);
cout << root->m_value << " ";
}
}
6.求节点个数
int Tree::Size(Node* root)
{
if (root == nullptr)
return 0;
else
return Size(root->m_left) + Size(root->m_right) + 1;
}
7.求树的深度
int Tree::Height(Node* root)
{
if (root == nullptr)
return 0;
else
{
int L = Height(root->m_left);
int R = Height(root->m_right);
return L > R ? (L + 1) : (R + 1);
}
}
8.查找二叉树中是否存在该节点
Node* Tree::Search(Node* root, char v)
{
Node* p = nullptr;
if (root == nullptr)
return nullptr;
if (root->m_value == v)
return root;
p = Search(root->m_left, v);//递归循环它的左子树
if (p != nullptr)
return p;
return Search(root->m_right, v);//左子树没找到就递归循环右子树
}
9.查找该结点的父亲节点
Node* Tree::DadSearch(Node* root, char v)
{
Node* end = nullptr;
if (root == nullptr)
end = nullptr;
if (root->m_left != nullptr && root->m_left->m_value == v)
end = root;
if (root->m_right != nullptr && root->m_right->m_value == v)
end = root;
return end;
}
主函数
void main()
{
//Node* p = new Node('a');
Tree t;
const char* str = "ABDG##I###CE#J##F##";
t.m_root = t.Create1(str);
//t.Create(t.m_root, str);
cout << "PreOrder:";
t.PreOrder(t.m_root);
cout << endl;
cout << "InOrder:";
t.InOrder(t.m_root);
cout << endl;
cout << "PostOrder:";
t.PostOrder(t.m_root);
cout << endl;
cout << "size = " << t.Size(t.m_root) << endl;
cout << "height = " << t.Height(t.m_root) << endl;
Node* p = t.Search(t.m_root, 'A');
if (p)
{
cout << p->m_value << endl;
}
else
{
cout << "没找到" << endl;
}
p = t.DadSearch(t.m_root, 'C');
if (p)
{
cout << p->m_value << endl;
}
else
{
cout << "没找到" << endl;
}
}
运行结果: