概念:
一颗二叉树是结点的一个有限集合,该集合为空或者是由一个根节点和一个左子树和一个右子树构成的组合。
特点:
每个结点最多有两个子树,每个子树的顺序不能变,份左子树和右子树。
分类:
满二叉树:在一棵树里面每个分支结点都存在左子树和右子树,并且所有的叶子节点都在同一层。
完全二叉树:一棵具有N个结点的二叉树的结构和满二叉树的前N个结点相
二叉树的性质
若二叉树根结点的层数为1,那么这个非空二叉树的第i层最多有2^(i-1)个结点。
若根节点二叉树的深度为1,那么深度为K的二叉树的最大结点数是2^K-1;
对于任何一棵二叉树,如果叶节点个数为N0,度为2的非叶节点的个数为N1,那么N0 = N1+1;
二叉树的基本操作:
二叉树的遍历
前序:
- 先访问根节点—–>左子树 —–>右子树
结果:A B D E C F
中序:
- 左子树—–>访问根结点—– >右子树
结果:D B E A F C
后序:
- 左子树—–>根节点—–>访问右子树
结果:D E B F C A
层序:
- 每一层顺序遍历二叉树
结果:A B C D E F
【二叉树的基本操作代码】
#include<stack>
#include<iostream>
using namespace std;
template<class T>
struct TreeNode
{
TreeNode()
:leftTree(NULL)
,rightTree(NULL)
{}
TreeNode(T& d)
:leftTree(NULL)
,rightTree(NULL)
,data(d)
{}
TreeNode(const TreeNode& t)
:leftTree(t.leftTree)
,rightTree(t.rightTree)
,data(t.data)
{}
TreeNode<T>* leftTree;
TreeNode<T>* rightTree;
T data;
};
template<class T>
class BinaryTree
{
typedef TreeNode<T> Node;
public:
BinaryTree(T* arr,size_t N,T& invalid) //construct function
:_root(NULL)
{
if(arr)
{
size_t index = 0;
_root = GreatTreeNode(_root,arr,N,index,invalid);
}
}
BinaryTree(BinaryTree<T>& t) //copy construction
{
_root = _CopyTree(t._root);
}
Node* _CopyTree(Node *root2) //copy tree
{
if(NULL == root2)
return NULL;
Node* root1 = new Node(root2->data);
root1->leftTree = _CopyTree(root2->leftTree);
root1->rightTree = _CopyTree(root2->rightTree);
return root1;
}
void PrePrint() //print by front
{
_PrePrint(_root);
}
void _PrePrint(Node* root)
{
if(NULL == root)
return ;
cout<<root->data<<" ";
_PrePrint(root->leftTree);
_PrePrint(root->right